add tests for case and constr
Fix a minor issue with decoding order
This commit is contained in:
@@ -207,22 +207,17 @@ where
|
||||
6 => Ok(Term::Error),
|
||||
7 => Ok(Term::Builtin(DefaultFunction::decode(d)?)),
|
||||
8 => {
|
||||
let tag = usize::decode(d)?;
|
||||
let fields = d.decode_list_with(|d| Term::<T>::decode(d))?;
|
||||
|
||||
Ok(Term::Constr {
|
||||
tag: usize::decode(d)?,
|
||||
fields,
|
||||
})
|
||||
Ok(Term::Constr { tag, fields })
|
||||
}
|
||||
9 => {
|
||||
let constr = Term::<T>::decode(d)?;
|
||||
let constr = (Term::<T>::decode(d)?).into();
|
||||
|
||||
let branches = d.decode_list_with(|d| Term::<T>::decode(d))?;
|
||||
|
||||
Ok(Term::Case {
|
||||
constr: Rc::new(constr),
|
||||
branches,
|
||||
})
|
||||
Ok(Term::Case { constr, branches })
|
||||
}
|
||||
x => {
|
||||
let buffer_slice: Vec<u8> = d
|
||||
@@ -386,6 +381,29 @@ where
|
||||
}
|
||||
}
|
||||
}
|
||||
8 => {
|
||||
state_log.push("(constr ".to_string());
|
||||
|
||||
let tag = usize::decode(d)?;
|
||||
|
||||
let fields = d.decode_list_with_debug(
|
||||
|d, state_log| Term::<T>::decode_debug(d, state_log),
|
||||
state_log,
|
||||
)?;
|
||||
|
||||
Ok(Term::Constr { tag, fields })
|
||||
}
|
||||
9 => {
|
||||
state_log.push("(case ".to_string());
|
||||
let constr = Term::<T>::decode_debug(d, state_log)?.into();
|
||||
|
||||
let branches = d.decode_list_with_debug(
|
||||
|d, state_log| Term::<T>::decode_debug(d, state_log),
|
||||
state_log,
|
||||
)?;
|
||||
|
||||
Ok(Term::Case { constr, branches })
|
||||
}
|
||||
x => {
|
||||
state_log.push("parse error".to_string());
|
||||
|
||||
|
||||
@@ -505,7 +505,7 @@ mod tests {
|
||||
];
|
||||
|
||||
for (fun, tag, n, m, result) in test_data {
|
||||
let eval_result = make_program(fun, tag, n, m).eval(ExBudget::default());
|
||||
let eval_result = make_program(fun, tag, n, m).eval(ExBudget::max());
|
||||
|
||||
assert_eq!(
|
||||
eval_result.result().unwrap(),
|
||||
@@ -535,7 +535,7 @@ mod tests {
|
||||
let test_data = vec![(0, 5), (1, 10), (2, 15)];
|
||||
|
||||
for (tag, result) in test_data {
|
||||
let eval_result = make_program(tag).eval(ExBudget::default());
|
||||
let eval_result = make_program(tag).eval(ExBudget::max());
|
||||
|
||||
assert_eq!(
|
||||
eval_result.result().unwrap(),
|
||||
|
||||
@@ -39,7 +39,7 @@ impl ExBudget {
|
||||
|
||||
pub fn max() -> Self {
|
||||
ExBudget {
|
||||
mem: 14000000000,
|
||||
mem: 14000000000000,
|
||||
cpu: 10000000000000,
|
||||
}
|
||||
}
|
||||
@@ -147,12 +147,12 @@ impl MachineCosts {
|
||||
},
|
||||
// Placeholder values
|
||||
constr: ExBudget {
|
||||
mem: 100,
|
||||
cpu: 23000,
|
||||
mem: 30000000000,
|
||||
cpu: 30000000000,
|
||||
},
|
||||
case: ExBudget {
|
||||
mem: 100,
|
||||
cpu: 23000,
|
||||
mem: 30000000000,
|
||||
cpu: 30000000000,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -193,12 +193,12 @@ impl Default for MachineCosts {
|
||||
},
|
||||
// Placeholder values
|
||||
constr: ExBudget {
|
||||
mem: 100,
|
||||
cpu: 23000,
|
||||
mem: 30000000000,
|
||||
cpu: 30000000000,
|
||||
},
|
||||
case: ExBudget {
|
||||
mem: 100,
|
||||
cpu: 23000,
|
||||
mem: 30000000000,
|
||||
cpu: 30000000000,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,13 +145,13 @@ peg::parser! {
|
||||
= "(" _* "error" _* ")" { Term::Error }
|
||||
|
||||
rule constr() -> Term<Name>
|
||||
= "(" _* "constr" _+ tag:decimal() _+ fields:(t:term() _* { t })+ ")" {
|
||||
= "(" _* "constr" _+ tag:decimal() _* fields:(t:term() _* { t })* _* ")" {
|
||||
Term::Constr { tag, fields }
|
||||
}
|
||||
|
||||
#[cache_left_rec]
|
||||
rule case() -> Term<Name>
|
||||
= "(" _* "case" _+ constr:term() _* branches:(t:term() _* { t })+ ")" {
|
||||
= "(" _* "case" _+ constr:term() _* branches:(t:term() _* { t })+ _* ")" {
|
||||
Term::Case { constr: constr.into(), branches }
|
||||
}
|
||||
|
||||
|
||||
BIN
crates/uplc/test_data/case_constr/case_constr.flat
Normal file
BIN
crates/uplc/test_data/case_constr/case_constr.flat
Normal file
Binary file not shown.
4
crates/uplc/test_data/case_constr/case_constr.uplc
Normal file
4
crates/uplc/test_data/case_constr/case_constr.uplc
Normal file
@@ -0,0 +1,4 @@
|
||||
(program
|
||||
1.0.0
|
||||
(case (constr 0)(constr 0(con integer 0))(constr 1(con integer 1)))
|
||||
)
|
||||
@@ -74,6 +74,14 @@ fn fibonacci() {
|
||||
round_trip_test(bytes, code);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn case_constr() {
|
||||
let bytes = include_bytes!("../test_data/case_constr/case_constr.flat");
|
||||
let code = include_str!("../test_data/case_constr/case_constr.uplc");
|
||||
|
||||
round_trip_test(bytes, code);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn one_way_fibonacci() {
|
||||
let bytes = include_bytes!("../test_data/fibonacci/fibonacci.flat");
|
||||
|
||||
Reference in New Issue
Block a user