diff --git a/src/wasm_test/compare.rs b/src/wasm_test/compare.rs index e8b6b4d0..ad7d232a 100644 --- a/src/wasm_test/compare.rs +++ b/src/wasm_test/compare.rs @@ -86,6 +86,10 @@ fn compare_json_value<'b, 's>( source: &'s str, emacs: &'b Token<'s>, ) -> Result, Box> { + println!("XXXXXXXXXXXXXX compare_json_value XXXXXXXXXXXXXX"); + println!("{:?}", emacs); + println!("{:?}", value); + println!("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); match (value, emacs) { (serde_json::Value::Object(wasm), Token::List(el)) if wasm.contains_key("ast-node") => { // We hit a regular ast node. @@ -97,6 +101,14 @@ fn compare_json_value<'b, 's>( // We hit a string compared against a quoted string from elisp (as opposed to an unquoted literal). compare_quoted_string(source, e, w) } + (serde_json::Value::Array(w), Token::List(e)) => { + wasm_compare_list(source, e.iter(), w.iter()) + } + (serde_json::Value::Object(wasm), Token::List(e)) + if wasm.contains_key("optval") && wasm.contains_key("val") => + { + compare_optional_pair(source, e, wasm) + } (serde_json::Value::Null, Token::Atom(_)) => todo!(), (serde_json::Value::Null, Token::List(_)) => todo!(), (serde_json::Value::Null, Token::TextWithProperties(_)) => todo!(), @@ -114,7 +126,7 @@ fn compare_json_value<'b, 's>( (serde_json::Value::String(_), Token::TextWithProperties(_)) => todo!(), (serde_json::Value::String(_), Token::Vector(_)) => todo!(), (serde_json::Value::Array(_), Token::Atom(_)) => todo!(), - (serde_json::Value::Array(_), Token::List(_)) => todo!(), + // (serde_json::Value::Array(_), Token::List(_)) => todo!(), (serde_json::Value::Array(_), Token::TextWithProperties(_)) => todo!(), (serde_json::Value::Array(_), Token::Vector(_)) => todo!(), (serde_json::Value::Object(_), Token::Atom(_)) => todo!(), @@ -405,6 +417,67 @@ where }) } +fn compare_optional_pair<'e, 's, 'w>( + source: &'s str, + emacs: &'e Vec>, + wasm: &'w serde_json::Map, +) -> Result, Box> { + let mut result = WasmDiffResult::default(); + let wasm_optval = wasm + .get("optval") + .ok_or(r#"Wasm optional pair should have an "optval" attribute."#)?; + let wasm_val = wasm + .get("val") + .ok_or(r#"Wasm optional pair should have an "optval" attribute."#)?; + if let serde_json::Value::Null = wasm_optval { + // If the optval is null, then the elisp should have just a single value of a quoted string. + if emacs.len() != 1 { + return Ok(WasmDiffResult { + status: vec![WasmDiffStatus::Bad( + format!( + "Optional pair with null optval should have 1 element. Emacs=({emacs:?}) Wasm=({wasm:?}).", + emacs = emacs, + wasm = wasm + ) + .into(), + )], + children: Vec::new(), + name: "".into(), + }); + } + + let emacs_val = emacs + .first() + .expect("If-statement proves this will be Some."); + result.extend(compare_json_value(wasm_val, source, emacs_val)?)?; + } else { + // If the optval is not null, then the elisp should have 3 values, the optval, a dot, and the val. + if emacs.len() != 3 { + return Ok(WasmDiffResult { + status: vec![WasmDiffStatus::Bad( + format!( + "Optional pair with non-null optval should have 3 elements. Emacs=({emacs:?}) Wasm=({wasm:?}).", + emacs = emacs, + wasm = wasm + ) + .into(), + )], + children: Vec::new(), + name: "".into(), + }); + } + let emacs_optval = emacs + .first() + .expect("If-statement proves this will be Some."); + let emacs_val = emacs + .get(2) + .expect("If-statement proves this will be Some."); + result.extend(compare_json_value(wasm_optval, source, emacs_optval)?)?; + result.extend(compare_json_value(wasm_val, source, emacs_val)?)?; + } + Ok(result) +} + // pub fn old_wasm_compare_document<'b, 's, 'p>( // source: &'s str, // emacs: &'b Token<'s>,