More OPA conformance; in-progress: ability to trace interpreter (#63)

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
Anand Krishnamoorthi
2023-12-16 17:50:59 -08:00
committed by GitHub
parent 73ee18f002
commit 577e1aa8db
19 changed files with 428 additions and 172 deletions
+8 -5
View File
@@ -85,11 +85,14 @@ fn run_aci_tests(dir: &Path) -> Result<()> {
println!("passed {:?}", duration);
}
Ok(actual) => {
println!("failed {:?}", duration);
println!("ACTUAL:");
println!("{}", serde_json::to_string(&actual)?);
println!("EXPECTED");
println!("{}", serde_json::to_string(&case.want_result)?);
println!(
"DIFF {}",
colored_diff::PrettyDifference {
expected: &serde_yaml::to_string(&case.want_result)?,
actual: &serde_yaml::to_string(&actual)?
}
);
nfailures += 1;
}
Err(e) => {
@@ -214,8 +214,8 @@ cases:
0,
"",
[],
set(),
{},
set()
]
results = {
@@ -241,35 +241,35 @@ cases:
lt:
object!:
- key: null
value: [false, 0, "", [], {}, {"set!":[]}]
value: [false, 0, "", [], {"set!":[]}, {}]
- key: false
value: [0, "", [], {}, {"set!":[]}]
value: [0, "", [], {"set!":[]}, {}]
- key: 0
value: ["", [], {}, {"set!":[]}]
value: ["", [], {"set!":[]}, {}]
- key: ""
value: [[], {}, {"set!":[]}]
value: [[], {"set!":[]}, {}]
- key: []
value: [{}, {"set!":[]}]
- key: {}
value: [{"set!":[]}]
value: [{"set!":[]}, {}]
- key: {"set!":[]}
value: [{}]
- key: {}
value: []
le:
object!:
- key: null
value: [null, false, 0, "", [], {}, {"set!":[]}]
value: [null, false, 0, "", [], {"set!":[]}, {}]
- key: false
value: [false, 0, "", [], {}, {"set!":[]}]
value: [false, 0, "", [], {"set!":[]}, {}]
- key: 0
value: [0, "", [], {}, {"set!":[]}]
value: [0, "", [], {"set!":[]}, {}]
- key: ""
value: ["", [], {}, {"set!":[]}]
value: ["", [], {"set!":[]}, {}]
- key: []
value: [[], {}, {"set!":[]}]
- key: {}
value: [{}, {"set!":[]}]
value: [[], {"set!":[]}, {}]
- key: {"set!":[]}
value: [{"set!":[]}]
value: [{"set!":[]}, {}]
- key: {}
value: [{}]
gt:
object!:
- key: null
@@ -282,10 +282,10 @@ cases:
value: [null, false, 0]
- key: []
value: [null, false, 0, ""]
- key: {}
value: [null, false, 0, "", []]
- key: {"set!":[]}
value: [null, false, 0, "", [], {}]
value: [null, false, 0, "", []]
- key: {}
value: [null, false, 0, "", [], {"set!":[]}]
ge:
object!:
- key: null
@@ -298,10 +298,10 @@ cases:
value: [null, false, 0, ""]
- key: []
value: [null, false, 0, "", []]
- key: {}
value: [null, false, 0, "", [], {}]
- key: {"set!":[]}
value: [null, false, 0, "", [], {}, {"set!":[]}]
value: [null, false, 0, "", [], {"set!":[]}]
- key: {}
value: [null, false, 0, "", [], {"set!":[]}, {}]
- note: arrays
data: {}
@@ -15,10 +15,6 @@ cases:
# Single item range
r5 = numbers.range(8, 8)
# Non-integer start and end result in Undefined.
r6 = numbers.range(1.01, 5)
r7 = numbers.range(1, 5.01)
y { false }
r8 = numbers.range(y, 10)
r9 = numbers.range(10, y)
@@ -31,6 +27,24 @@ cases:
r4: [-5, -4, -3, -2, -1]
r5: [8]
- note: non integer start
data: {}
modules:
- |
package test
r6 = numbers.range(1.01, 5)
error: must be integer
query: data
- note: non integer start
data: {}
modules:
- |
package test
r7 = numbers.range(1, 5.01)
error: must be integer
query: data
- note: less-args
data: {}
modules:
+9 -77
View File
@@ -68,85 +68,17 @@ pub fn process_value(v: &Value) -> Result<Value> {
}
}
fn display_values(c: &Value, e: &Value) -> Result<String> {
Ok(format!(
"\nleft = {}\nright = {}\n",
serde_json::to_string_pretty(c)?,
serde_json::to_string_pretty(e)?
))
}
// Helper function to match computed and expecte values.
// On mismatch, prints the failing sub-value instead of the whole value.
fn match_values_impl(computed: &Value, expected: &Value) -> Result<()> {
match (&computed, &expected) {
(Value::Array(a1), Value::Array(a2)) => {
if a1.len() != a2.len() {
bail!(
"array length mismatch: {} != {}{}",
a1.len(),
a2.len(),
display_values(computed, expected)?
);
}
for (idx, v1) in a1.iter().enumerate() {
match_values_impl(v1, &a2[idx])?;
}
Ok(())
}
(Value::Set(s1), Value::Set(s2)) => {
if s1.len() != s2.len() {
bail!(
"set length mismatch: {} != {}{}",
s1.len(),
s2.len(),
display_values(computed, expected)?
);
}
let mut itr2 = s2.iter();
for v1 in s1.iter() {
match_values_impl(v1, itr2.next().unwrap())?;
}
Ok(())
}
(Value::Object(o1), Value::Object(o2)) => {
if o1.len() != o2.len() {
bail!(
"object length mismatch: {} != {}{}",
o1.len(),
o2.len(),
display_values(computed, expected)?
);
}
let mut itr2 = o2.iter();
for (k1, v1) in o1.iter() {
let (k2, v2) = itr2.next().unwrap();
match_values_impl(k1, k2)?;
match_values_impl(v1, v2)?;
}
Ok(())
}
(Value::Number(n1), Value::Number(n2)) if n1 == n2 => Ok(()),
(Value::String(s1), Value::String(s2)) if s1 == s2 => Ok(()),
(Value::Bool(b1), Value::Bool(b2)) if b1 == b2 => Ok(()),
(Value::Null, Value::Null) => Ok(()),
(Value::Undefined, Value::Undefined) => Ok(()),
_ => bail!("value mismatch: {}", display_values(computed, expected)?),
}
}
fn match_values(computed: &Value, expected: &Value) -> Result<()> {
match match_values_impl(computed, expected) {
Ok(()) => Ok(()),
Err(e) => bail!("\nmismatch in {}{}", display_values(computed, expected)?, e),
if computed != expected {
panic!(
"{}",
colored_diff::PrettyDifference {
expected: &serde_yaml::to_string(&expected)?,
actual: &serde_yaml::to_string(&computed)?
}
);
}
Ok(())
}
pub fn check_output(computed_results: &[Value], expected_results: &[Value]) -> Result<()> {
+12 -1
View File
@@ -25,6 +25,7 @@ cryptomd5
cryptosha1
cryptosha256
dataderef
defaultkeyword
disjunction
elsekeyword
embeddedvirtualdoc
@@ -44,7 +45,10 @@ invalidkeyerror
jsonfilteridempotent
jwtencodesignheadererrors
jwtencodesignpayloaderrors
negation
nestedreferences
numbersrange
numbersrangestep
objectfilter
objectfilteridempotent
objectfilternonstringkey
@@ -55,6 +59,7 @@ objectremoveidempotent
objectremovenonstringkey
partialdocconstants
partialsetdoc
planner-ir
rand
regexfind
regexfindallstringsubmatch
@@ -65,9 +70,13 @@ regexreplace
regexsplit
replacen
semvercompare
semverisvalid
sets
sprintf
subset
toarray
topdowndynamicdispatch
toset
trim
trimleft
trimprefix
@@ -79,4 +88,6 @@ typebuiltin
typenamebuiltin
undos
union
units
units
varreferences
virtualdocs
+3 -1
View File
@@ -145,7 +145,9 @@ fn run_opa_tests(opa_tests_dir: String, folders: &[String]) -> Result<()> {
println!("\n{} failed.", case.note);
println!("{}", serde_yaml::to_string(&case)?);
match &r {
Ok(actual) => println!("GOT\n{}", serde_yaml::to_string(&actual)?),
Ok(actual) => {
println!("GOT\n{}", serde_yaml::to_string(&actual)?);
}
Err(e) => println!("ERROR: {e}"),
}
+1 -1
View File
@@ -43,8 +43,8 @@ fn non_string_key() -> Result<()> {
"false": null,
"3.141592653589793": null,
"[true,null,3.141592653589793]": null,
"{\"null\":null,\"false\":null,\"3.141592653589793\":null,\"[true,null,3.141592653589793]\":null,\"[false,true,3.141592653589793]\":null,\"\\\"<undefined>\\\"\":null}": null,
"[false,true,3.141592653589793]": null,
"{\"null\":null,\"false\":null,\"3.141592653589793\":null,\"[true,null,3.141592653589793]\":null,\"[false,true,3.141592653589793]\":null,\"\\\"<undefined>\\\"\":null}": null,
"\"<undefined>\"": null
}"#;