@@ -358,6 +358,16 @@ func TestCheckInferenceRules(t *testing.T) {
358
358
{`overlap` , `p.q2.a = input.a { true }` },
359
359
{`overlap` , `p.q2[56] = input.a { true }` },
360
360
}
361
+ ruleset3 := [][2 ]string {
362
+ {`simple` , `p.q[r][s] = 42 { x = ["a", "b"]; r = x[s] }` },
363
+ {`mixed` , `p.q[r].s[t] = 42 { x = ["a", "b"]; r = x[t] }` },
364
+ {`overrides` , `p.q[r] = "foo" { x = ["a", "b"]; r = x[_] }` },
365
+ {`overrides` , `p.q.r[s] = 42 { x = ["a", "b"]; x[s] }` },
366
+ {`overrides` , `p.q[r].s = true { x = [true, false]; r = x[_] }` },
367
+ {`overrides_static` , `p.q[r].a = "foo" { r = "bar"; s = "baz" }` },
368
+ {`overrides_static` , `p.q[r].b = 42 { r = "bar" }` },
369
+ {`overrides_static` , `p.q[r].c = true { r = "bar" }` },
370
+ }
361
371
362
372
tests := []struct {
363
373
note string
@@ -549,6 +559,104 @@ func TestCheckInferenceRules(t *testing.T) {
549
559
types .NewDynamicProperty (types.Any {types .N , types .S }, types.Any {types .B , types .N , types .S }),
550
560
),
551
561
},
562
+ {
563
+ note : "general ref-rules, only vars in obj-path, complete obj access" ,
564
+ rules : ruleset3 ,
565
+ ref : "data.simple.p.q" ,
566
+ expected : types .NewObject (
567
+ []* types.StaticProperty {},
568
+ types .NewDynamicProperty (types .S ,
569
+ types .NewObject (
570
+ []* types.StaticProperty {},
571
+ types .NewDynamicProperty (types .N , types .N ),
572
+ ),
573
+ ),
574
+ ),
575
+ },
576
+ {
577
+ note : "general ref-rules, only vars in obj-path, intermediate obj access" ,
578
+ rules : ruleset3 ,
579
+ ref : "data.simple.p.q.b" ,
580
+ expected : types .NewObject (
581
+ []* types.StaticProperty {},
582
+ types .NewDynamicProperty (types .N , types .N ),
583
+ ),
584
+ },
585
+ {
586
+ note : "general ref-rules, only vars in obj-path, leaf access" ,
587
+ rules : ruleset3 ,
588
+ ref : "data.simple.p.q.b[1]" ,
589
+ expected : types .N ,
590
+ },
591
+ {
592
+ note : "general ref-rules, vars and constants in obj-path, complete obj access" ,
593
+ rules : ruleset3 ,
594
+ ref : "data.mixed.p.q" ,
595
+ expected : types .NewObject (
596
+ []* types.StaticProperty {},
597
+ types .NewDynamicProperty (types .S ,
598
+ types .NewObject (nil ,
599
+ types .NewDynamicProperty (types .S , types .NewObject (nil ,
600
+ types .NewDynamicProperty (types .N , types .N ))),
601
+ ),
602
+ ),
603
+ ),
604
+ },
605
+ {
606
+ note : "general ref-rules, key overrides, complete obj access" ,
607
+ rules : ruleset3 ,
608
+ ref : "data.overrides.p.q" ,
609
+ expected : types .NewObject (nil , types .NewDynamicProperty (
610
+ types .Or (types .B , types .S ),
611
+ types.Any {
612
+ types .S ,
613
+ types .NewObject (nil , types .NewDynamicProperty (
614
+ types.Any {types .N , types .S },
615
+ types.Any {types .B , types .N })),
616
+ },
617
+ ),
618
+ ),
619
+ },
620
+ {
621
+ note : "general ref-rules, multiple static key overrides, complete obj access" ,
622
+ rules : ruleset3 ,
623
+ ref : "data.overrides_static.p.q" ,
624
+ expected : types .NewObject (
625
+ []* types.StaticProperty {},
626
+ types .NewDynamicProperty (types .S ,
627
+ types .NewObject (
628
+ nil ,
629
+ types .NewDynamicProperty (types .S , types.Any {types .B , types .N , types .S }),
630
+ ),
631
+ ),
632
+ ),
633
+ },
634
+ {
635
+ note : "general ref-rules, multiple static key overrides, intermediate obj access" ,
636
+ rules : ruleset3 ,
637
+ ref : "data.overrides_static.p.q.foo" ,
638
+ expected : types .NewObject (nil ,
639
+ types .NewDynamicProperty (types .S , types.Any {types .B , types .N , types .S }),
640
+ ),
641
+ },
642
+ {
643
+ note : "general ref-rules, multiple static key overrides, leaf access (a)" ,
644
+ rules : ruleset3 ,
645
+ ref : "data.overrides_static.p.q.foo.a" ,
646
+ expected : types.Any {types .B , types .N , types .S }, // Dynamically build object types don't have static properties, so even though we "know" the 'a' key has a string value, we've lost this information.
647
+ },
648
+ {
649
+ note : "general ref-rules, multiple static key overrides, leaf access (b)" ,
650
+ rules : ruleset3 ,
651
+ ref : "data.overrides_static.p.q.bar.b" ,
652
+ expected : types.Any {types .B , types .N , types .S },
653
+ },
654
+ {
655
+ note : "general ref-rules, multiple static key overrides, leaf access (c)" ,
656
+ rules : ruleset3 ,
657
+ ref : "data.overrides_static.p.q.baz.c" ,
658
+ expected : types.Any {types .B , types .N , types .S },
659
+ },
552
660
}
553
661
554
662
for _ , tc := range tests {
0 commit comments