1// Copyright 2018 The OPA Authors. All rights reserved. 2// Use of this source code is governed by an Apache2 3// license that can be found in the LICENSE file. 4 5package topdown 6 7import ( 8 "testing" 9) 10 11func TestTopDownArray(t *testing.T) { 12 13 tests := []struct { 14 note string 15 rules []string 16 expected interface{} 17 }{ 18 {"concat", []string{`p = x { x = array.concat([1,2], [3,4]) }`}, "[1,2,3,4]"}, 19 {"concat: err", []string{`p = x { x = array.concat(data.b, [3,4]) }`}, &Error{Code: TypeErr, Message: "array.concat: operand 1 must be array but got object"}}, 20 {"concat: err rhs", []string{`p = x { x = array.concat([1,2], data.b) }`}, &Error{Code: TypeErr, Message: "array.concat: operand 2 must be array but got object"}}, 21 22 {"slice", []string{`p = x { x = array.slice([1,2,3,4,5], 1, 3) }`}, "[2,3]"}, 23 {"slice: empty slice", []string{`p = x { x = array.slice([1,2,3], 0, 0) }`}, "[]"}, 24 {"slice: negative indices", []string{`p = x { x = array.slice([1,2,3,4,5], -4, -1) }`}, "[]"}, 25 {"slice: stopIndex < startIndex", []string{`p = x { x = array.slice([1,2,3,4,5], 4, 1) }`}, "[]"}, 26 {"slice: clamp startIndex", []string{`p = x { x = array.slice([1,2,3,4,5], -1, 2) }`}, `[1,2]`}, 27 {"slice: clamp stopIndex", []string{`p = x {x = array.slice([1,2,3,4,5], 3, 6) }`}, `[4,5]`}, 28 } 29 30 data := loadSmallTestData() 31 32 for _, tc := range tests { 33 runTopDownTestCase(t, data, tc.note, tc.rules, tc.expected) 34 } 35} 36