@@ -902,8 +902,8 @@ var cmpTests = []cmpTest{
902902 {"eq 1 2" , "false" , true },
903903 {"eq `xy` `xy`" , "true" , true },
904904 {"eq `xy` `xyz`" , "false" , true },
905- {"eq .Xuint .Xuint " , "true" , true },
906- {"eq .Xuint .Yuint " , "false" , true },
905+ {"eq .Uthree .Uthree " , "true" , true },
906+ {"eq .Uthree .Ufour " , "false" , true },
907907 {"eq 3 4 5 6 3" , "true" , true },
908908 {"eq 3 4 5 6 7" , "false" , true },
909909 {"ne true true" , "false" , true },
@@ -916,16 +916,16 @@ var cmpTests = []cmpTest{
916916 {"ne 1 2" , "true" , true },
917917 {"ne `xy` `xy`" , "false" , true },
918918 {"ne `xy` `xyz`" , "true" , true },
919- {"ne .Xuint .Xuint " , "false" , true },
920- {"ne .Xuint .Yuint " , "true" , true },
919+ {"ne .Uthree .Uthree " , "false" , true },
920+ {"ne .Uthree .Ufour " , "true" , true },
921921 {"lt 1.5 1.5" , "false" , true },
922922 {"lt 1.5 2.5" , "true" , true },
923923 {"lt 1 1" , "false" , true },
924924 {"lt 1 2" , "true" , true },
925925 {"lt `xy` `xy`" , "false" , true },
926926 {"lt `xy` `xyz`" , "true" , true },
927- {"lt .Xuint .Xuint " , "false" , true },
928- {"lt .Xuint .Yuint " , "true" , true },
927+ {"lt .Uthree .Uthree " , "false" , true },
928+ {"lt .Uthree .Ufour " , "true" , true },
929929 {"le 1.5 1.5" , "true" , true },
930930 {"le 1.5 2.5" , "true" , true },
931931 {"le 2.5 1.5" , "false" , true },
@@ -935,19 +935,19 @@ var cmpTests = []cmpTest{
935935 {"le `xy` `xy`" , "true" , true },
936936 {"le `xy` `xyz`" , "true" , true },
937937 {"le `xyz` `xy`" , "false" , true },
938- {"le .Xuint .Xuint " , "true" , true },
939- {"le .Xuint .Yuint " , "true" , true },
940- {"le .Yuint .Xuint " , "false" , true },
938+ {"le .Uthree .Uthree " , "true" , true },
939+ {"le .Uthree .Ufour " , "true" , true },
940+ {"le .Ufour .Uthree " , "false" , true },
941941 {"gt 1.5 1.5" , "false" , true },
942942 {"gt 1.5 2.5" , "false" , true },
943943 {"gt 1 1" , "false" , true },
944944 {"gt 2 1" , "true" , true },
945945 {"gt 1 2" , "false" , true },
946946 {"gt `xy` `xy`" , "false" , true },
947947 {"gt `xy` `xyz`" , "false" , true },
948- {"gt .Xuint .Xuint " , "false" , true },
949- {"gt .Xuint .Yuint " , "false" , true },
950- {"gt .Yuint .Xuint " , "true" , true },
948+ {"gt .Uthree .Uthree " , "false" , true },
949+ {"gt .Uthree .Ufour " , "false" , true },
950+ {"gt .Ufour .Uthree " , "true" , true },
951951 {"ge 1.5 1.5" , "true" , true },
952952 {"ge 1.5 2.5" , "false" , true },
953953 {"ge 2.5 1.5" , "true" , true },
@@ -957,25 +957,55 @@ var cmpTests = []cmpTest{
957957 {"ge `xy` `xy`" , "true" , true },
958958 {"ge `xy` `xyz`" , "false" , true },
959959 {"ge `xyz` `xy`" , "true" , true },
960- {"ge .Xuint .Xuint" , "true" , true },
961- {"ge .Xuint .Yuint" , "false" , true },
962- {"ge .Yuint .Xuint" , "true" , true },
960+ {"ge .Uthree .Uthree" , "true" , true },
961+ {"ge .Uthree .Ufour" , "false" , true },
962+ {"ge .Ufour .Uthree" , "true" , true },
963+ // Mixing signed and unsigned integers.
964+ {"eq .Uthree .Three" , "true" , true },
965+ {"eq .Three .Uthree" , "true" , true },
966+ {"le .Uthree .Three" , "true" , true },
967+ {"le .Three .Uthree" , "true" , true },
968+ {"ge .Uthree .Three" , "true" , true },
969+ {"ge .Three .Uthree" , "true" , true },
970+ {"lt .Uthree .Three" , "false" , true },
971+ {"lt .Three .Uthree" , "false" , true },
972+ {"gt .Uthree .Three" , "false" , true },
973+ {"gt .Three .Uthree" , "false" , true },
974+ {"eq .Ufour .Three" , "false" , true },
975+ {"lt .Ufour .Three" , "false" , true },
976+ {"gt .Ufour .Three" , "true" , true },
977+ {"eq .NegOne .Uthree" , "false" , true },
978+ {"eq .Uthree .NegOne" , "false" , true },
979+ {"ne .NegOne .Uthree" , "true" , true },
980+ {"ne .Uthree .NegOne" , "true" , true },
981+ {"lt .NegOne .Uthree" , "true" , true },
982+ {"lt .Uthree .NegOne" , "false" , true },
983+ {"le .NegOne .Uthree" , "true" , true },
984+ {"le .Uthree .NegOne" , "false" , true },
985+ {"gt .NegOne .Uthree" , "false" , true },
986+ {"gt .Uthree .NegOne" , "true" , true },
987+ {"ge .NegOne .Uthree" , "false" , true },
988+ {"ge .Uthree .NegOne" , "true" , true },
989+ {"eq (index `x` 0) 'x'" , "true" , true }, // The example that triggered this rule.
990+ {"eq (index `x` 0) 'y'" , "false" , true },
963991 // Errors
964992 {"eq `xy` 1" , "" , false }, // Different types.
993+ {"eq 2 2.0" , "" , false }, // Different types.
965994 {"lt true true" , "" , false }, // Unordered types.
966995 {"lt 1+0i 1+0i" , "" , false }, // Unordered types.
967996}
968997
969998func TestComparison (t * testing.T ) {
970999 b := new (bytes.Buffer )
9711000 var cmpStruct = struct {
972- Xuint , Yuint uint
973- }{3 , 4 }
1001+ Uthree , Ufour uint
1002+ NegOne , Three int
1003+ }{3 , 4 , - 1 , 3 }
9741004 for _ , test := range cmpTests {
9751005 text := fmt .Sprintf ("{{if %s}}true{{else}}false{{end}}" , test .expr )
9761006 tmpl , err := New ("empty" ).Parse (text )
9771007 if err != nil {
978- t .Fatal ( err )
1008+ t .Fatalf ( "%q: %s" , test . expr , err )
9791009 }
9801010 b .Reset ()
9811011 err = tmpl .Execute (b , & cmpStruct )
0 commit comments