github.com/hashicorp/packer@v1.14.3/hcl2template/function/index_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package function
     5  
     6  import (
     7  	"fmt"
     8  	"testing"
     9  
    10  	"github.com/zclconf/go-cty/cty"
    11  )
    12  
    13  func TestIndex(t *testing.T) {
    14  	tests := []struct {
    15  		List  cty.Value
    16  		Value cty.Value
    17  		Want  cty.Value
    18  		Err   bool
    19  	}{
    20  		{
    21  			cty.ListVal([]cty.Value{
    22  				cty.StringVal("a"),
    23  				cty.StringVal("b"),
    24  				cty.StringVal("c"),
    25  			}),
    26  			cty.StringVal("a"),
    27  			cty.NumberIntVal(0),
    28  			false,
    29  		},
    30  		{
    31  			cty.ListVal([]cty.Value{
    32  				cty.StringVal("a"),
    33  				cty.StringVal("b"),
    34  				cty.UnknownVal(cty.String),
    35  			}),
    36  			cty.StringVal("a"),
    37  			cty.NumberIntVal(0),
    38  			false,
    39  		},
    40  		{
    41  			cty.ListVal([]cty.Value{
    42  				cty.StringVal("a"),
    43  				cty.StringVal("b"),
    44  				cty.StringVal("c"),
    45  			}),
    46  			cty.StringVal("b"),
    47  			cty.NumberIntVal(1),
    48  			false,
    49  		},
    50  		{
    51  			cty.ListVal([]cty.Value{
    52  				cty.StringVal("a"),
    53  				cty.StringVal("b"),
    54  				cty.StringVal("c"),
    55  			}),
    56  			cty.StringVal("z"),
    57  			cty.NilVal,
    58  			true,
    59  		},
    60  		{
    61  			cty.ListVal([]cty.Value{
    62  				cty.StringVal("1"),
    63  				cty.StringVal("2"),
    64  				cty.StringVal("3"),
    65  			}),
    66  			cty.NumberIntVal(1),
    67  			cty.NumberIntVal(0),
    68  			true,
    69  		},
    70  		{
    71  			cty.ListVal([]cty.Value{
    72  				cty.NumberIntVal(1),
    73  				cty.NumberIntVal(2),
    74  				cty.NumberIntVal(3),
    75  			}),
    76  			cty.NumberIntVal(2),
    77  			cty.NumberIntVal(1),
    78  			false,
    79  		},
    80  		{
    81  			cty.ListVal([]cty.Value{
    82  				cty.NumberIntVal(1),
    83  				cty.NumberIntVal(2),
    84  				cty.NumberIntVal(3),
    85  			}),
    86  			cty.NumberIntVal(4),
    87  			cty.NilVal,
    88  			true,
    89  		},
    90  		{
    91  			cty.ListVal([]cty.Value{
    92  				cty.NumberIntVal(1),
    93  				cty.NumberIntVal(2),
    94  				cty.NumberIntVal(3),
    95  			}),
    96  			cty.StringVal("1"),
    97  			cty.NumberIntVal(0),
    98  			true,
    99  		},
   100  		{
   101  			cty.TupleVal([]cty.Value{
   102  				cty.NumberIntVal(1),
   103  				cty.NumberIntVal(2),
   104  				cty.NumberIntVal(3),
   105  			}),
   106  			cty.NumberIntVal(1),
   107  			cty.NumberIntVal(0),
   108  			false,
   109  		},
   110  	}
   111  
   112  	for _, test := range tests {
   113  		t.Run(fmt.Sprintf("index(%#v, %#v)", test.List, test.Value), func(t *testing.T) {
   114  			got, err := Index(test.List, test.Value)
   115  
   116  			if test.Err {
   117  				if err == nil {
   118  					t.Fatal("succeeded; want error")
   119  				}
   120  				return
   121  			} else if err != nil {
   122  				t.Fatalf("unexpected error: %s", err)
   123  			}
   124  
   125  			if !got.RawEquals(test.Want) {
   126  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   127  			}
   128  		})
   129  	}
   130  }