Import of https://github.com/ciena/voltctl at commit 40d61fbf3f910ed4017cf67c9c79e8e1f82a33a5

Change-Id: I8464c59e60d76cb8612891db3303878975b5416c
diff --git a/pkg/order/order_test.go b/pkg/order/order_test.go
new file mode 100644
index 0000000..484d0a6
--- /dev/null
+++ b/pkg/order/order_test.go
@@ -0,0 +1,231 @@
+package order
+
+import (
+	"testing"
+)
+
+type SortTestStruct struct {
+	Id    int
+	One   string
+	Two   string
+	Three uint
+	Four  int
+}
+
+var testSetOne = []SortTestStruct{
+	{
+		Id:    0,
+		One:   "a",
+		Two:   "x",
+		Three: 10,
+		Four:  1,
+	},
+	{
+		Id:    1,
+		One:   "a",
+		Two:   "c",
+		Three: 1,
+		Four:  10,
+	},
+	{
+		Id:    2,
+		One:   "a",
+		Two:   "b",
+		Three: 2,
+		Four:  1000,
+	},
+	{
+		Id:    3,
+		One:   "a",
+		Two:   "a",
+		Three: 3,
+		Four:  100,
+	},
+	{
+		Id:    4,
+		One:   "b",
+		Two:   "a",
+		Three: 3,
+		Four:  0,
+	},
+}
+
+var testSetTwo = []SortTestStruct{
+	{
+		Id:    0,
+		One:   "a",
+		Two:   "x",
+		Three: 10,
+		Four:  10,
+	},
+	{
+		Id:    1,
+		One:   "a",
+		Two:   "y",
+		Three: 1,
+		Four:  1,
+	},
+}
+
+func Verify(v []SortTestStruct, order []int) bool {
+	for i, item := range v {
+		if item.Id != order[i] {
+			return false
+		}
+	}
+	return true
+}
+
+func TestSort(t *testing.T) {
+	s, err := Parse("+One,-Two")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetOne)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+
+	if !Verify(o.([]SortTestStruct), []int{0, 1, 2, 3, 4}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestSortASC(t *testing.T) {
+	s, err := Parse("+One,Two")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetTwo)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+
+	if !Verify(o.([]SortTestStruct), []int{0, 1}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestSortUintASC(t *testing.T) {
+	s, err := Parse("Three,One")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetOne)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+
+	if !Verify(o.([]SortTestStruct), []int{1, 2, 3, 4, 0}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestSortUintDSC(t *testing.T) {
+	s, err := Parse("-Three,One")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetOne)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+
+	if !Verify(o.([]SortTestStruct), []int{0, 3, 4, 2, 1}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestSortUintDSC2(t *testing.T) {
+	s, err := Parse("-Three,One")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetTwo)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+
+	if !Verify(o.([]SortTestStruct), []int{0, 1}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestSortIntASC(t *testing.T) {
+	s, err := Parse("Four,One")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetOne)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+	if !Verify(o.([]SortTestStruct), []int{4, 0, 1, 3, 2}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestSortIntDSC(t *testing.T) {
+	s, err := Parse("-Four,One")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetOne)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+	if !Verify(o.([]SortTestStruct), []int{2, 3, 1, 0, 4}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestSortIntDSC2(t *testing.T) {
+	s, err := Parse("-Four,One")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetTwo)
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+	if !Verify(o.([]SortTestStruct), []int{0, 1}) {
+		t.Errorf("incorrect sort")
+	}
+}
+
+func TestOperString(t *testing.T) {
+	if ASC.String() != "ASC" {
+		t.Errorf("ASC to string failed")
+	}
+	if DSC.String() != "DSC" {
+		t.Errorf("DSC to string failed")
+	}
+	var o Operation = 5 // Invalid
+	if o.String() != "ASC" {
+		t.Errorf("to string default failed")
+	}
+}
+
+func TestSortSingle(t *testing.T) {
+	s, err := Parse("-Four,One")
+	if err != nil {
+		t.Errorf("Unable to parse sort specification")
+	}
+	o, err := s.Process(testSetOne[0])
+	if err != nil {
+		t.Errorf("Sort failed: %s", err.Error())
+	}
+
+	if o == nil {
+		t.Errorf("expected value, got nil")
+	}
+
+	r, ok := o.(SortTestStruct)
+	if !ok {
+		t.Errorf("Unexpected result type")
+	}
+
+	if r.Id != testSetOne[0].Id {
+		t.Errorf("results don't match input")
+	}
+}