mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
More OPA conformance; in-progress: ability to trace interpreter (#63)
Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
committed by
GitHub
parent
73ee18f002
commit
577e1aa8db
+8
-5
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
}"#;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user