Browse Source

Wrote/generated more tests

typed
Weird Constructor 6 months ago
parent
commit
22eae2fb4d
  1. 2
      scripts/pack_jsons.wl
  2. BIN
      src/chemical_elements.json.lzw
  3. 23
      src/chemistry.rs
  4. 5
      src/prelude.rs
  5. 497
      tests/language.rs

2
scripts/pack_jsons.wl

@ -6,5 +6,5 @@
(std:deser:json
(std:io:file:read_text "src/chemical_elements.json"))
$true))
7;
8;
std:io:file:write_safe "src/chemical_elements.json.lzw" packed;

BIN
src/chemical_elements.json.lzw

Binary file not shown.

23
src/chemistry.rs

@ -29,7 +29,7 @@ fn load_elems() {
let elems_data_packed = include_bytes!("chemical_elements.json.lzw");
match Decoder::new(BitOrder::Msb, 7).decode(elems_data_packed) {
match Decoder::new(BitOrder::Msb, 8).decode(elems_data_packed) {
Ok(data) => {
let s = String::from_utf8(data).unwrap();
let chemical_data_tree = VVal::from_json(&s).expect("No malformed json compiled in!");
@ -405,12 +405,12 @@ fn try_parse_element(ps: &mut State) -> Option<u8> {
},
'Y' | 'y' => match s.at(1) {
'b' => Some((2, 70)), // Yb: Ytterbium
_ => None,
_ => Some((1, 39)), // Y: Yttrium
},
'Z' | 'z' => match s.at(1) {
'n' => Some((2, 30)), // Zn: Zinc
'r' => Some((2, 40)), // Zr: Zirconium
_ => Some((1, 39)), // Y: Yttrium
_ => None,
},
'U' | 'u' => Some((1, 92)), // U: Uranium
'V' | 'v' => Some((1, 23)), // V: Vanadium
@ -522,6 +522,23 @@ fn parse_sequence(ps: &mut State) -> Result<Vec<ChemFormula>, ParseError> {
Ok(ret)
}
pub fn get_periodic_table_data() -> VVal {
let not_loaded = ELEMS_VEC.with(|v| v.borrow().is_empty());
if not_loaded {
load_elems();
}
let ret = VVal::vec();
ELEMS_VEC.with(|v| {
for elem in v.borrow().iter() {
ret.push(elem.clone());
}
});
ret
}
pub fn parse_chemical_sum_formula(s: &str) -> Result<VVal, ParseError> {
let mut ps = State::new_verbatim(s, "<chemical-sum-formula>");

5
src/prelude.rs

@ -13548,6 +13548,11 @@ pub fn std_symbol_table() -> SymbolTable {
}
}, Some(1), Some(2), false);
func!(st, "chem:data",
|_env: &mut Env, _argc: usize| {
Ok(crate::chemistry::get_periodic_table_data())
}, Some(0), Some(0), false);
func!(st, "chem:parse",
|env: &mut Env, _argc: usize| {
env.arg(0).with_s_ref(|s| {

497
tests/language.rs

@ -5956,10 +5956,501 @@ fn check_prelude_lzw() {
#[test]
fn check_chem() {
assert_eq!(ve("!c = std:chem:parse :FeH2O; c.first_atomic_number[]"), "1");
assert!(false, "For each element, make a parse for it appearing alone and one for a combination");
assert_eq!(ve("!c = std:chem:parse :FeH2O; c.first_elem_info[].atomic_number"), "26");
assert_eq!(ve(r#"
!sum_formula = std:chem:parse "c14 (h19)2 n o2 cl h";
$@i sum_formula.for_each_element \$+ _2.atomic_mass * _1
"#), "287");
assert_eq!(ve(r#"
!sum_formula = std:chem:parse "c14 (h19)2 n o2 cl h";
$@f sum_formula.for_each_element \$+ _2.atomic_mass * _1
"#), "288.921");
assert_eq!(ve("std:chem:parse :H1"), "$<Chem:H>");
assert_eq!(ve("std:chem:parse :H9"), "$<Chem:H9>");
assert_eq!(ve("std:chem:parse :H"), "$<Chem:H>");
assert_eq!(ve("std:chem:parse :He"), "$<Chem:He>");
assert_eq!(ve("std:chem:parse :Li"), "$<Chem:Li>");
assert_eq!(ve("std:chem:parse :Be"), "$<Chem:Be>");
assert_eq!(ve("std:chem:parse :B"), "$<Chem:B>");
assert_eq!(ve("std:chem:parse :C"), "$<Chem:C>");
assert_eq!(ve("std:chem:parse :N"), "$<Chem:N>");
assert_eq!(ve("std:chem:parse :O"), "$<Chem:O>");
assert_eq!(ve("std:chem:parse :F"), "$<Chem:F>");
assert_eq!(ve("std:chem:parse :Ne"), "$<Chem:Ne>");
assert_eq!(ve("std:chem:parse :Na"), "$<Chem:Na>");
assert_eq!(ve("std:chem:parse :Mg"), "$<Chem:Mg>");
assert_eq!(ve("std:chem:parse :Al"), "$<Chem:Al>");
assert_eq!(ve("std:chem:parse :Si"), "$<Chem:Si>");
assert_eq!(ve("std:chem:parse :P"), "$<Chem:P>");
assert_eq!(ve("std:chem:parse :S"), "$<Chem:S>");
assert_eq!(ve("std:chem:parse :Cl"), "$<Chem:Cl>");
assert_eq!(ve("std:chem:parse :Ar"), "$<Chem:Ar>");
assert_eq!(ve("std:chem:parse :K"), "$<Chem:K>");
assert_eq!(ve("std:chem:parse :Ca"), "$<Chem:Ca>");
assert_eq!(ve("std:chem:parse :Sc"), "$<Chem:Sc>");
assert_eq!(ve("std:chem:parse :Ti"), "$<Chem:Ti>");
assert_eq!(ve("std:chem:parse :V"), "$<Chem:V>");
assert_eq!(ve("std:chem:parse :Cr"), "$<Chem:Cr>");
assert_eq!(ve("std:chem:parse :Mn"), "$<Chem:Mn>");
assert_eq!(ve("std:chem:parse :Fe"), "$<Chem:Fe>");
assert_eq!(ve("std:chem:parse :Co"), "$<Chem:Co>");
assert_eq!(ve("std:chem:parse :Ni"), "$<Chem:Ni>");
assert_eq!(ve("std:chem:parse :Cu"), "$<Chem:Cu>");
assert_eq!(ve("std:chem:parse :Zn"), "$<Chem:Zn>");
assert_eq!(ve("std:chem:parse :Ga"), "$<Chem:Ga>");
assert_eq!(ve("std:chem:parse :Ge"), "$<Chem:Ge>");
assert_eq!(ve("std:chem:parse :As"), "$<Chem:As>");
assert_eq!(ve("std:chem:parse :Se"), "$<Chem:Se>");
assert_eq!(ve("std:chem:parse :Br"), "$<Chem:Br>");
assert_eq!(ve("std:chem:parse :Kr"), "$<Chem:Kr>");
assert_eq!(ve("std:chem:parse :Rb"), "$<Chem:Rb>");
assert_eq!(ve("std:chem:parse :Sr"), "$<Chem:Sr>");
assert_eq!(ve("std:chem:parse :Y"), "$<Chem:Y>");
assert_eq!(ve("std:chem:parse :Zr"), "$<Chem:Zr>");
assert_eq!(ve("std:chem:parse :Nb"), "$<Chem:Nb>");
assert_eq!(ve("std:chem:parse :Mo"), "$<Chem:Mo>");
assert_eq!(ve("std:chem:parse :Tc"), "$<Chem:Tc>");
assert_eq!(ve("std:chem:parse :Ru"), "$<Chem:Ru>");
assert_eq!(ve("std:chem:parse :Rh"), "$<Chem:Rh>");
assert_eq!(ve("std:chem:parse :Pd"), "$<Chem:Pd>");
assert_eq!(ve("std:chem:parse :Ag"), "$<Chem:Ag>");
assert_eq!(ve("std:chem:parse :Cd"), "$<Chem:Cd>");
assert_eq!(ve("std:chem:parse :In"), "$<Chem:In>");
assert_eq!(ve("std:chem:parse :Sn"), "$<Chem:Sn>");
assert_eq!(ve("std:chem:parse :Sb"), "$<Chem:Sb>");
assert_eq!(ve("std:chem:parse :Te"), "$<Chem:Te>");
assert_eq!(ve("std:chem:parse :I"), "$<Chem:I>");
assert_eq!(ve("std:chem:parse :Xe"), "$<Chem:Xe>");
assert_eq!(ve("std:chem:parse :Cs"), "$<Chem:Cs>");
assert_eq!(ve("std:chem:parse :Ba"), "$<Chem:Ba>");
assert_eq!(ve("std:chem:parse :La"), "$<Chem:La>");
assert_eq!(ve("std:chem:parse :Ce"), "$<Chem:Ce>");
assert_eq!(ve("std:chem:parse :Pr"), "$<Chem:Pr>");
assert_eq!(ve("std:chem:parse :Nd"), "$<Chem:Nd>");
assert_eq!(ve("std:chem:parse :Pm"), "$<Chem:Pm>");
assert_eq!(ve("std:chem:parse :Sm"), "$<Chem:Sm>");
assert_eq!(ve("std:chem:parse :Eu"), "$<Chem:Eu>");
assert_eq!(ve("std:chem:parse :Gd"), "$<Chem:Gd>");
assert_eq!(ve("std:chem:parse :Tb"), "$<Chem:Tb>");
assert_eq!(ve("std:chem:parse :Dy"), "$<Chem:Dy>");
assert_eq!(ve("std:chem:parse :Ho"), "$<Chem:Ho>");
assert_eq!(ve("std:chem:parse :Er"), "$<Chem:Er>");
assert_eq!(ve("std:chem:parse :Tm"), "$<Chem:Tm>");
assert_eq!(ve("std:chem:parse :Yb"), "$<Chem:Yb>");
assert_eq!(ve("std:chem:parse :Lu"), "$<Chem:Lu>");
assert_eq!(ve("std:chem:parse :Hf"), "$<Chem:Hf>");
assert_eq!(ve("std:chem:parse :Ta"), "$<Chem:Ta>");
assert_eq!(ve("std:chem:parse :W"), "$<Chem:W>");
assert_eq!(ve("std:chem:parse :Re"), "$<Chem:Re>");
assert_eq!(ve("std:chem:parse :Os"), "$<Chem:Os>");
assert_eq!(ve("std:chem:parse :Ir"), "$<Chem:Ir>");
assert_eq!(ve("std:chem:parse :Pt"), "$<Chem:Pt>");
assert_eq!(ve("std:chem:parse :Au"), "$<Chem:Au>");
assert_eq!(ve("std:chem:parse :Hg"), "$<Chem:Hg>");
assert_eq!(ve("std:chem:parse :Tl"), "$<Chem:Tl>");
assert_eq!(ve("std:chem:parse :Pb"), "$<Chem:Pb>");
assert_eq!(ve("std:chem:parse :Bi"), "$<Chem:Bi>");
assert_eq!(ve("std:chem:parse :Po"), "$<Chem:Po>");
assert_eq!(ve("std:chem:parse :At"), "$<Chem:At>");
assert_eq!(ve("std:chem:parse :Rn"), "$<Chem:Rn>");
assert_eq!(ve("std:chem:parse :Fr"), "$<Chem:Fr>");
assert_eq!(ve("std:chem:parse :Ra"), "$<Chem:Ra>");
assert_eq!(ve("std:chem:parse :Ac"), "$<Chem:Ac>");
assert_eq!(ve("std:chem:parse :Th"), "$<Chem:Th>");
assert_eq!(ve("std:chem:parse :Pa"), "$<Chem:Pa>");
assert_eq!(ve("std:chem:parse :U"), "$<Chem:U>");
assert_eq!(ve("std:chem:parse :Np"), "$<Chem:Np>");
assert_eq!(ve("std:chem:parse :Pu"), "$<Chem:Pu>");
assert_eq!(ve("std:chem:parse :Am"), "$<Chem:Am>");
assert_eq!(ve("std:chem:parse :Cm"), "$<Chem:Cm>");
assert_eq!(ve("std:chem:parse :Bk"), "$<Chem:Bk>");
assert_eq!(ve("std:chem:parse :Cf"), "$<Chem:Cf>");
assert_eq!(ve("std:chem:parse :Es"), "$<Chem:Es>");
assert_eq!(ve("std:chem:parse :Fm"), "$<Chem:Fm>");
assert_eq!(ve("std:chem:parse :Md"), "$<Chem:Md>");
assert_eq!(ve("std:chem:parse :No"), "$<Chem:No>");
assert_eq!(ve("std:chem:parse :Lr"), "$<Chem:Lr>");
assert_eq!(ve("std:chem:parse :Rf"), "$<Chem:Rf>");
assert_eq!(ve("std:chem:parse :Db"), "$<Chem:Db>");
assert_eq!(ve("std:chem:parse :Sg"), "$<Chem:Sg>");
assert_eq!(ve("std:chem:parse :Bh"), "$<Chem:Bh>");
assert_eq!(ve("std:chem:parse :Hs"), "$<Chem:Hs>");
assert_eq!(ve("std:chem:parse :Mt"), "$<Chem:Mt>");
assert_eq!(ve("std:chem:parse :Ds"), "$<Chem:Ds>");
assert_eq!(ve("std:chem:parse :Rg"), "$<Chem:Rg>");
assert_eq!(ve("std:chem:parse :Cn"), "$<Chem:Cn>");
assert_eq!(ve("std:chem:parse :Nh"), "$<Chem:Nh>");
assert_eq!(ve("std:chem:parse :Fl"), "$<Chem:Fl>");
assert_eq!(ve("std:chem:parse :Mc"), "$<Chem:Mc>");
assert_eq!(ve("std:chem:parse :Lv"), "$<Chem:Lv>");
assert_eq!(ve("std:chem:parse :Ts"), "$<Chem:Ts>");
assert_eq!(ve("std:chem:parse :Og"), "$<Chem:Og>");
assert_eq!(ve("std:chem:parse :h"), "$<Chem:H>");
assert_eq!(ve("std:chem:parse :he"), "$<Chem:He>");
assert_eq!(ve("std:chem:parse :li"), "$<Chem:Li>");
assert_eq!(ve("std:chem:parse :be"), "$<Chem:Be>");
assert_eq!(ve("std:chem:parse :b"), "$<Chem:B>");
assert_eq!(ve("std:chem:parse :c"), "$<Chem:C>");
assert_eq!(ve("std:chem:parse :n"), "$<Chem:N>");
assert_eq!(ve("std:chem:parse :o"), "$<Chem:O>");
assert_eq!(ve("std:chem:parse :f"), "$<Chem:F>");
assert_eq!(ve("std:chem:parse :ne"), "$<Chem:Ne>");
assert_eq!(ve("std:chem:parse :na"), "$<Chem:Na>");
assert_eq!(ve("std:chem:parse :mg"), "$<Chem:Mg>");
assert_eq!(ve("std:chem:parse :al"), "$<Chem:Al>");
assert_eq!(ve("std:chem:parse :si"), "$<Chem:Si>");
assert_eq!(ve("std:chem:parse :p"), "$<Chem:P>");
assert_eq!(ve("std:chem:parse :s"), "$<Chem:S>");
assert_eq!(ve("std:chem:parse :cl"), "$<Chem:Cl>");
assert_eq!(ve("std:chem:parse :ar"), "$<Chem:Ar>");
assert_eq!(ve("std:chem:parse :k"), "$<Chem:K>");
assert_eq!(ve("std:chem:parse :ca"), "$<Chem:Ca>");
assert_eq!(ve("std:chem:parse :sc"), "$<Chem:Sc>");
assert_eq!(ve("std:chem:parse :ti"), "$<Chem:Ti>");
assert_eq!(ve("std:chem:parse :v"), "$<Chem:V>");
assert_eq!(ve("std:chem:parse :cr"), "$<Chem:Cr>");
assert_eq!(ve("std:chem:parse :mn"), "$<Chem:Mn>");
assert_eq!(ve("std:chem:parse :fe"), "$<Chem:Fe>");
assert_eq!(ve("std:chem:parse :co"), "$<Chem:Co>");
assert_eq!(ve("std:chem:parse :ni"), "$<Chem:Ni>");
assert_eq!(ve("std:chem:parse :cu"), "$<Chem:Cu>");
assert_eq!(ve("std:chem:parse :zn"), "$<Chem:Zn>");
assert_eq!(ve("std:chem:parse :ga"), "$<Chem:Ga>");
assert_eq!(ve("std:chem:parse :ge"), "$<Chem:Ge>");
assert_eq!(ve("std:chem:parse :as"), "$<Chem:As>");
assert_eq!(ve("std:chem:parse :se"), "$<Chem:Se>");
assert_eq!(ve("std:chem:parse :br"), "$<Chem:Br>");
assert_eq!(ve("std:chem:parse :kr"), "$<Chem:Kr>");
assert_eq!(ve("std:chem:parse :rb"), "$<Chem:Rb>");
assert_eq!(ve("std:chem:parse :sr"), "$<Chem:Sr>");
assert_eq!(ve("std:chem:parse :y"), "$<Chem:Y>");
assert_eq!(ve("std:chem:parse :zr"), "$<Chem:Zr>");
assert_eq!(ve("std:chem:parse :nb"), "$<Chem:Nb>");
assert_eq!(ve("std:chem:parse :mo"), "$<Chem:Mo>");
assert_eq!(ve("std:chem:parse :tc"), "$<Chem:Tc>");
assert_eq!(ve("std:chem:parse :ru"), "$<Chem:Ru>");
assert_eq!(ve("std:chem:parse :rh"), "$<Chem:Rh>");
assert_eq!(ve("std:chem:parse :pd"), "$<Chem:Pd>");
assert_eq!(ve("std:chem:parse :ag"), "$<Chem:Ag>");
assert_eq!(ve("std:chem:parse :cd"), "$<Chem:Cd>");
assert_eq!(ve("std:chem:parse :in"), "$<Chem:In>");
assert_eq!(ve("std:chem:parse :sn"), "$<Chem:Sn>");
assert_eq!(ve("std:chem:parse :sb"), "$<Chem:Sb>");
assert_eq!(ve("std:chem:parse :te"), "$<Chem:Te>");
assert_eq!(ve("std:chem:parse :i"), "$<Chem:I>");
assert_eq!(ve("std:chem:parse :xe"), "$<Chem:Xe>");
assert_eq!(ve("std:chem:parse :cs"), "$<Chem:Cs>");
assert_eq!(ve("std:chem:parse :ba"), "$<Chem:Ba>");
assert_eq!(ve("std:chem:parse :la"), "$<Chem:La>");
assert_eq!(ve("std:chem:parse :ce"), "$<Chem:Ce>");
assert_eq!(ve("std:chem:parse :pr"), "$<Chem:Pr>");
assert_eq!(ve("std:chem:parse :nd"), "$<Chem:Nd>");
assert_eq!(ve("std:chem:parse :pm"), "$<Chem:Pm>");
assert_eq!(ve("std:chem:parse :sm"), "$<Chem:Sm>");
assert_eq!(ve("std:chem:parse :eu"), "$<Chem:Eu>");
assert_eq!(ve("std:chem:parse :gd"), "$<Chem:Gd>");
assert_eq!(ve("std:chem:parse :tb"), "$<Chem:Tb>");
assert_eq!(ve("std:chem:parse :dy"), "$<Chem:Dy>");
assert_eq!(ve("std:chem:parse :ho"), "$<Chem:Ho>");
assert_eq!(ve("std:chem:parse :er"), "$<Chem:Er>");
assert_eq!(ve("std:chem:parse :tm"), "$<Chem:Tm>");
assert_eq!(ve("std:chem:parse :yb"), "$<Chem:Yb>");
assert_eq!(ve("std:chem:parse :lu"), "$<Chem:Lu>");
assert_eq!(ve("std:chem:parse :hf"), "$<Chem:Hf>");
assert_eq!(ve("std:chem:parse :ta"), "$<Chem:Ta>");
assert_eq!(ve("std:chem:parse :w"), "$<Chem:W>");
assert_eq!(ve("std:chem:parse :re"), "$<Chem:Re>");
assert_eq!(ve("std:chem:parse :os"), "$<Chem:Os>");
assert_eq!(ve("std:chem:parse :ir"), "$<Chem:Ir>");
assert_eq!(ve("std:chem:parse :pt"), "$<Chem:Pt>");
assert_eq!(ve("std:chem:parse :au"), "$<Chem:Au>");
assert_eq!(ve("std:chem:parse :hg"), "$<Chem:Hg>");
assert_eq!(ve("std:chem:parse :tl"), "$<Chem:Tl>");
assert_eq!(ve("std:chem:parse :pb"), "$<Chem:Pb>");
assert_eq!(ve("std:chem:parse :bi"), "$<Chem:Bi>");
assert_eq!(ve("std:chem:parse :po"), "$<Chem:Po>");
assert_eq!(ve("std:chem:parse :at"), "$<Chem:At>");
assert_eq!(ve("std:chem:parse :rn"), "$<Chem:Rn>");
assert_eq!(ve("std:chem:parse :fr"), "$<Chem:Fr>");
assert_eq!(ve("std:chem:parse :ra"), "$<Chem:Ra>");
assert_eq!(ve("std:chem:parse :ac"), "$<Chem:Ac>");
assert_eq!(ve("std:chem:parse :th"), "$<Chem:Th>");
assert_eq!(ve("std:chem:parse :pa"), "$<Chem:Pa>");
assert_eq!(ve("std:chem:parse :u"), "$<Chem:U>");
assert_eq!(ve("std:chem:parse :np"), "$<Chem:Np>");
assert_eq!(ve("std:chem:parse :pu"), "$<Chem:Pu>");
assert_eq!(ve("std:chem:parse :am"), "$<Chem:Am>");
assert_eq!(ve("std:chem:parse :cm"), "$<Chem:Cm>");
assert_eq!(ve("std:chem:parse :bk"), "$<Chem:Bk>");
assert_eq!(ve("std:chem:parse :cf"), "$<Chem:Cf>");
assert_eq!(ve("std:chem:parse :es"), "$<Chem:Es>");
assert_eq!(ve("std:chem:parse :fm"), "$<Chem:Fm>");
assert_eq!(ve("std:chem:parse :md"), "$<Chem:Md>");
assert_eq!(ve("std:chem:parse :no"), "$<Chem:No>");
assert_eq!(ve("std:chem:parse :lr"), "$<Chem:Lr>");
assert_eq!(ve("std:chem:parse :rf"), "$<Chem:Rf>");
assert_eq!(ve("std:chem:parse :db"), "$<Chem:Db>");
assert_eq!(ve("std:chem:parse :sg"), "$<Chem:Sg>");
assert_eq!(ve("std:chem:parse :bh"), "$<Chem:Bh>");
assert_eq!(ve("std:chem:parse :hs"), "$<Chem:Hs>");
assert_eq!(ve("std:chem:parse :mt"), "$<Chem:Mt>");
assert_eq!(ve("std:chem:parse :ds"), "$<Chem:Ds>");
assert_eq!(ve("std:chem:parse :rg"), "$<Chem:Rg>");
assert_eq!(ve("std:chem:parse :cn"), "$<Chem:Cn>");
assert_eq!(ve("std:chem:parse :nh"), "$<Chem:Nh>");
assert_eq!(ve("std:chem:parse :fl"), "$<Chem:Fl>");
assert_eq!(ve("std:chem:parse :mc"), "$<Chem:Mc>");
assert_eq!(ve("std:chem:parse :lv"), "$<Chem:Lv>");
assert_eq!(ve("std:chem:parse :ts"), "$<Chem:Ts>");
assert_eq!(ve("std:chem:parse :og"), "$<Chem:Og>");
assert_eq!(ve("std:chem:parse :OHFe"), "$<Chem:OHFe>");
assert_eq!(ve("std:chem:parse :OHeFe"), "$<Chem:OHeFe>");
assert_eq!(ve("std:chem:parse :OLiFe"), "$<Chem:OLiFe>");
assert_eq!(ve("std:chem:parse :OBeFe"), "$<Chem:OBeFe>");
assert_eq!(ve("std:chem:parse :OBFe"), "$<Chem:OBFe>");
assert_eq!(ve("std:chem:parse :OCFe"), "$<Chem:OCFe>");
assert_eq!(ve("std:chem:parse :ONFe"), "$<Chem:ONFe>");
assert_eq!(ve("std:chem:parse :OOFe"), "$<Chem:OOFe>");
assert_eq!(ve("std:chem:parse :OFFe"), "$<Chem:OFFe>");
assert_eq!(ve("std:chem:parse :ONeFe"), "$<Chem:ONeFe>");
assert_eq!(ve("std:chem:parse :ONaFe"), "$<Chem:ONaFe>");
assert_eq!(ve("std:chem:parse :OMgFe"), "$<Chem:OMgFe>");
assert_eq!(ve("std:chem:parse :OAlFe"), "$<Chem:OAlFe>");
assert_eq!(ve("std:chem:parse :OSiFe"), "$<Chem:OSiFe>");
assert_eq!(ve("std:chem:parse :OPFe"), "$<Chem:OPFe>");
assert_eq!(ve("std:chem:parse :OSFe"), "$<Chem:OSFe>");
assert_eq!(ve("std:chem:parse :OClFe"), "$<Chem:OClFe>");
assert_eq!(ve("std:chem:parse :OArFe"), "$<Chem:OArFe>");
assert_eq!(ve("std:chem:parse :OKFe"), "$<Chem:OKFe>");
assert_eq!(ve("std:chem:parse :OCaFe"), "$<Chem:OCaFe>");
assert_eq!(ve("std:chem:parse :OScFe"), "$<Chem:OScFe>");
assert_eq!(ve("std:chem:parse :OTiFe"), "$<Chem:OTiFe>");
assert_eq!(ve("std:chem:parse :OVFe"), "$<Chem:OVFe>");
assert_eq!(ve("std:chem:parse :OCrFe"), "$<Chem:OCrFe>");
assert_eq!(ve("std:chem:parse :OMnFe"), "$<Chem:OMnFe>");
assert_eq!(ve("std:chem:parse :OFeFe"), "$<Chem:OFeFe>");
assert_eq!(ve("std:chem:parse :OCoFe"), "$<Chem:OCoFe>");
assert_eq!(ve("std:chem:parse :ONiFe"), "$<Chem:ONiFe>");
assert_eq!(ve("std:chem:parse :OCuFe"), "$<Chem:OCuFe>");
assert_eq!(ve("std:chem:parse :OZnFe"), "$<Chem:OZnFe>");
assert_eq!(ve("std:chem:parse :OGaFe"), "$<Chem:OGaFe>");
assert_eq!(ve("std:chem:parse :OGeFe"), "$<Chem:OGeFe>");
assert_eq!(ve("std:chem:parse :OAsFe"), "$<Chem:OAsFe>");
assert_eq!(ve("std:chem:parse :OSeFe"), "$<Chem:OSeFe>");
assert_eq!(ve("std:chem:parse :OBrFe"), "$<Chem:OBrFe>");
assert_eq!(ve("std:chem:parse :OKrFe"), "$<Chem:OKrFe>");
assert_eq!(ve("std:chem:parse :ORbFe"), "$<Chem:ORbFe>");
assert_eq!(ve("std:chem:parse :OSrFe"), "$<Chem:OSrFe>");
assert_eq!(ve("std:chem:parse :OYFe"), "$<Chem:OYFe>");
assert_eq!(ve("std:chem:parse :OZrFe"), "$<Chem:OZrFe>");
assert_eq!(ve("std:chem:parse :ONbFe"), "$<Chem:ONbFe>");
assert_eq!(ve("std:chem:parse :OMoFe"), "$<Chem:OMoFe>");
assert_eq!(ve("std:chem:parse :OTcFe"), "$<Chem:OTcFe>");
assert_eq!(ve("std:chem:parse :ORuFe"), "$<Chem:ORuFe>");
assert_eq!(ve("std:chem:parse :ORhFe"), "$<Chem:ORhFe>");
assert_eq!(ve("std:chem:parse :OPdFe"), "$<Chem:OPdFe>");
assert_eq!(ve("std:chem:parse :OAgFe"), "$<Chem:OAgFe>");
assert_eq!(ve("std:chem:parse :OCdFe"), "$<Chem:OCdFe>");
assert_eq!(ve("std:chem:parse :OInFe"), "$<Chem:OInFe>");
assert_eq!(ve("std:chem:parse :OSnFe"), "$<Chem:OSnFe>");
assert_eq!(ve("std:chem:parse :OSbFe"), "$<Chem:OSbFe>");
assert_eq!(ve("std:chem:parse :OTeFe"), "$<Chem:OTeFe>");
assert_eq!(ve("std:chem:parse :OIFe"), "$<Chem:OIFe>");
assert_eq!(ve("std:chem:parse :OXeFe"), "$<Chem:OXeFe>");
assert_eq!(ve("std:chem:parse :OCsFe"), "$<Chem:OCsFe>");
assert_eq!(ve("std:chem:parse :OBaFe"), "$<Chem:OBaFe>");
assert_eq!(ve("std:chem:parse :OLaFe"), "$<Chem:OLaFe>");
assert_eq!(ve("std:chem:parse :OCeFe"), "$<Chem:OCeFe>");
assert_eq!(ve("std:chem:parse :OPrFe"), "$<Chem:OPrFe>");
assert_eq!(ve("std:chem:parse :ONdFe"), "$<Chem:ONdFe>");
assert_eq!(ve("std:chem:parse :OPmFe"), "$<Chem:OPmFe>");
assert_eq!(ve("std:chem:parse :OSmFe"), "$<Chem:OSmFe>");
assert_eq!(ve("std:chem:parse :OEuFe"), "$<Chem:OEuFe>");
assert_eq!(ve("std:chem:parse :OGdFe"), "$<Chem:OGdFe>");
assert_eq!(ve("std:chem:parse :OTbFe"), "$<Chem:OTbFe>");
assert_eq!(ve("std:chem:parse :ODyFe"), "$<Chem:ODyFe>");
assert_eq!(ve("std:chem:parse :OHoFe"), "$<Chem:OHoFe>");
assert_eq!(ve("std:chem:parse :OErFe"), "$<Chem:OErFe>");
assert_eq!(ve("std:chem:parse :OTmFe"), "$<Chem:OTmFe>");
assert_eq!(ve("std:chem:parse :OYbFe"), "$<Chem:OYbFe>");
assert_eq!(ve("std:chem:parse :OLuFe"), "$<Chem:OLuFe>");
assert_eq!(ve("std:chem:parse :OHfFe"), "$<Chem:OHfFe>");
assert_eq!(ve("std:chem:parse :OTaFe"), "$<Chem:OTaFe>");
assert_eq!(ve("std:chem:parse :OWFe"), "$<Chem:OWFe>");
assert_eq!(ve("std:chem:parse :OReFe"), "$<Chem:OReFe>");
assert_eq!(ve("std:chem:parse :OOsFe"), "$<Chem:OOsFe>");
assert_eq!(ve("std:chem:parse :OIrFe"), "$<Chem:OIrFe>");
assert_eq!(ve("std:chem:parse :OPtFe"), "$<Chem:OPtFe>");
assert_eq!(ve("std:chem:parse :OAuFe"), "$<Chem:OAuFe>");
assert_eq!(ve("std:chem:parse :OHgFe"), "$<Chem:OHgFe>");
assert_eq!(ve("std:chem:parse :OTlFe"), "$<Chem:OTlFe>");
assert_eq!(ve("std:chem:parse :OPbFe"), "$<Chem:OPbFe>");
assert_eq!(ve("std:chem:parse :OBiFe"), "$<Chem:OBiFe>");
assert_eq!(ve("std:chem:parse :OPoFe"), "$<Chem:OPoFe>");
assert_eq!(ve("std:chem:parse :OAtFe"), "$<Chem:OAtFe>");
assert_eq!(ve("std:chem:parse :ORnFe"), "$<Chem:ORnFe>");
assert_eq!(ve("std:chem:parse :OFrFe"), "$<Chem:OFrFe>");
assert_eq!(ve("std:chem:parse :ORaFe"), "$<Chem:ORaFe>");
assert_eq!(ve("std:chem:parse :OAcFe"), "$<Chem:OAcFe>");
assert_eq!(ve("std:chem:parse :OThFe"), "$<Chem:OThFe>");
assert_eq!(ve("std:chem:parse :OPaFe"), "$<Chem:OPaFe>");
assert_eq!(ve("std:chem:parse :OUFe"), "$<Chem:OUFe>");
assert_eq!(ve("std:chem:parse :ONpFe"), "$<Chem:ONpFe>");
assert_eq!(ve("std:chem:parse :OPuFe"), "$<Chem:OPuFe>");
assert_eq!(ve("std:chem:parse :OAmFe"), "$<Chem:OAmFe>");
assert_eq!(ve("std:chem:parse :OCmFe"), "$<Chem:OCmFe>");
assert_eq!(ve("std:chem:parse :OBkFe"), "$<Chem:OBkFe>");
assert_eq!(ve("std:chem:parse :OCfFe"), "$<Chem:OCfFe>");
assert_eq!(ve("std:chem:parse :OEsFe"), "$<Chem:OEsFe>");
assert_eq!(ve("std:chem:parse :OFmFe"), "$<Chem:OFmFe>");
assert_eq!(ve("std:chem:parse :OMdFe"), "$<Chem:OMdFe>");
assert_eq!(ve("std:chem:parse :ONoFe"), "$<Chem:ONoFe>");
assert_eq!(ve("std:chem:parse :OLrFe"), "$<Chem:OLrFe>");
assert_eq!(ve("std:chem:parse :ORfFe"), "$<Chem:ORfFe>");
assert_eq!(ve("std:chem:parse :ODbFe"), "$<Chem:ODbFe>");
assert_eq!(ve("std:chem:parse :OSgFe"), "$<Chem:OSgFe>");
assert_eq!(ve("std:chem:parse :OBhFe"), "$<Chem:OBhFe>");
assert_eq!(ve("std:chem:parse :OHsFe"), "$<Chem:OHsFe>");
assert_eq!(ve("std:chem:parse :OMtFe"), "$<Chem:OMtFe>");
assert_eq!(ve("std:chem:parse :ODsFe"), "$<Chem:ODsFe>");
assert_eq!(ve("std:chem:parse :ORgFe"), "$<Chem:ORgFe>");
assert_eq!(ve("std:chem:parse :OCnFe"), "$<Chem:OCnFe>");
assert_eq!(ve("std:chem:parse :ONhFe"), "$<Chem:ONhFe>");
assert_eq!(ve("std:chem:parse :OFlFe"), "$<Chem:OFlFe>");
assert_eq!(ve("std:chem:parse :OMcFe"), "$<Chem:OMcFe>");
assert_eq!(ve("std:chem:parse :OLvFe"), "$<Chem:OLvFe>");
assert_eq!(ve("std:chem:parse :OTsFe"), "$<Chem:OTsFe>");
assert_eq!(ve("std:chem:parse :OOgFe"), "$<Chem:OOgFe>");
assert_eq!(ve("std:chem:parse :OhFe"), "$<Chem:OHFe>");
assert_eq!(ve("std:chem:parse :OheFe"), "$<Chem:OHeFe>");
assert_eq!(ve("std:chem:parse :OliFe"), "$<Chem:OLiFe>");
assert_eq!(ve("std:chem:parse :ObeFe"), "$<Chem:OBeFe>");
assert_eq!(ve("std:chem:parse :ObFe"), "$<Chem:OBFe>");
assert_eq!(ve("std:chem:parse :OcFe"), "$<Chem:OCFe>");
assert_eq!(ve("std:chem:parse :OnFe"), "$<Chem:ONFe>");
assert_eq!(ve("std:chem:parse :OoFe"), "$<Chem:OOFe>");
assert_eq!(ve("std:chem:parse :OfFe"), "$<Chem:OFFe>");
assert_eq!(ve("std:chem:parse :OneFe"), "$<Chem:ONeFe>");
assert_eq!(ve("std:chem:parse :OnaFe"), "$<Chem:ONaFe>");
assert_eq!(ve("std:chem:parse :OmgFe"), "$<Chem:OMgFe>");
assert_eq!(ve("std:chem:parse :OalFe"), "$<Chem:OAlFe>");
// Osi => Os, I
assert_eq!(ve("std:chem:parse :OSiFe"), "$<Chem:OSiFe>");
assert_eq!(ve("std:chem:parse :OsIFe"), "$<Chem:OsIFe>");
assert_eq!(ve("std:chem:parse :OpFe"), "$<Chem:OPFe>");
// OSFe => OsFe
assert_eq!(ve("std:chem:parse :OsFe"), "$<Chem:OsFe>");
assert_eq!(ve("std:chem:parse :OclFe"), "$<Chem:OClFe>");
assert_eq!(ve("std:chem:parse :OarFe"), "$<Chem:OArFe>");
assert_eq!(ve("std:chem:parse :OkFe"), "$<Chem:OKFe>");
assert_eq!(ve("std:chem:parse :OcaFe"), "$<Chem:OCaFe>");
// OScFe
assert_eq!(ve("std:chem:parse :OScFe"), "$<Chem:OScFe>");
assert_eq!(ve("std:chem:parse :OtiFe"), "$<Chem:OTiFe>");
assert_eq!(ve("std:chem:parse :OvFe"), "$<Chem:OVFe>");
assert_eq!(ve("std:chem:parse :OcrFe"), "$<Chem:OCrFe>");
assert_eq!(ve("std:chem:parse :OmnFe"), "$<Chem:OMnFe>");
assert_eq!(ve("std:chem:parse :OfeFe"), "$<Chem:OFeFe>");
assert_eq!(ve("std:chem:parse :OcoFe"), "$<Chem:OCoFe>");
assert_eq!(ve("std:chem:parse :OniFe"), "$<Chem:ONiFe>");
assert_eq!(ve("std:chem:parse :OcuFe"), "$<Chem:OCuFe>");
assert_eq!(ve("std:chem:parse :OznFe"), "$<Chem:OZnFe>");
assert_eq!(ve("std:chem:parse :OGaFe"), "$<Chem:OGaFe>");
assert_eq!(ve("std:chem:parse :OGeFe"), "$<Chem:OGeFe>");
assert_eq!(ve("std:chem:parse :OasFe"), "$<Chem:OAsFe>");
assert_eq!(ve("std:chem:parse :OSeFe"), "$<Chem:OSeFe>");
assert_eq!(ve("std:chem:parse :ObrFe"), "$<Chem:OBrFe>");
assert_eq!(ve("std:chem:parse :OkrFe"), "$<Chem:OKrFe>");
assert_eq!(ve("std:chem:parse :OrbFe"), "$<Chem:ORbFe>");
assert_eq!(ve("std:chem:parse :OSrFe"), "$<Chem:OSrFe>");
assert_eq!(ve("std:chem:parse :OyFe"), "$<Chem:OYFe>");
assert_eq!(ve("std:chem:parse :OzrFe"), "$<Chem:OZrFe>");
assert_eq!(ve("std:chem:parse :OnbFe"), "$<Chem:ONbFe>");
assert_eq!(ve("std:chem:parse :OmoFe"), "$<Chem:OMoFe>");
assert_eq!(ve("std:chem:parse :OtcFe"), "$<Chem:OTcFe>");
assert_eq!(ve("std:chem:parse :OruFe"), "$<Chem:ORuFe>");
assert_eq!(ve("std:chem:parse :OrhFe"), "$<Chem:ORhFe>");
assert_eq!(ve("std:chem:parse :OpdFe"), "$<Chem:OPdFe>");
assert_eq!(ve("std:chem:parse :OagFe"), "$<Chem:OAgFe>");
assert_eq!(ve("std:chem:parse :OcdFe"), "$<Chem:OCdFe>");
assert_eq!(ve("std:chem:parse :OinFe"), "$<Chem:OInFe>");
assert_eq!(ve("std:chem:parse :OSnFe"), "$<Chem:OSnFe>");
assert_eq!(ve("std:chem:parse :OSbFe"), "$<Chem:OSbFe>");
assert_eq!(ve("std:chem:parse :OsnFe"), "$<Chem:OsNFe>");
assert_eq!(ve("std:chem:parse :OsbFe"), "$<Chem:OsBFe>");
assert_eq!(ve("std:chem:parse :OteFe"), "$<Chem:OTeFe>");
assert_eq!(ve("std:chem:parse :OiFe"), "$<Chem:OIFe>");
assert_eq!(ve("std:chem:parse :OxeFe"), "$<Chem:OXeFe>");
assert_eq!(ve("std:chem:parse :OcsFe"), "$<Chem:OCsFe>");
assert_eq!(ve("std:chem:parse :ObaFe"), "$<Chem:OBaFe>");
assert_eq!(ve("std:chem:parse :OlaFe"), "$<Chem:OLaFe>");
assert_eq!(ve("std:chem:parse :OceFe"), "$<Chem:OCeFe>");
assert_eq!(ve("std:chem:parse :OprFe"), "$<Chem:OPrFe>");
assert_eq!(ve("std:chem:parse :OndFe"), "$<Chem:ONdFe>");
assert_eq!(ve("std:chem:parse :OpmFe"), "$<Chem:OPmFe>");
assert_eq!(ve("std:chem:parse :OSmFe"), "$<Chem:OSmFe>");
assert_eq!(ve("std:chem:parse :OeuFe"), "$<Chem:OEuFe>");
assert_eq!(ve("std:chem:parse :OGdFe"), "$<Chem:OGdFe>");
assert_eq!(ve("std:chem:parse :OtbFe"), "$<Chem:OTbFe>");
assert_eq!(ve("std:chem:parse :OdyFe"), "$<Chem:ODyFe>");
assert_eq!(ve("std:chem:parse :OhoFe"), "$<Chem:OHoFe>");
assert_eq!(ve("std:chem:parse :OerFe"), "$<Chem:OErFe>");
assert_eq!(ve("std:chem:parse :OtmFe"), "$<Chem:OTmFe>");
assert_eq!(ve("std:chem:parse :OybFe"), "$<Chem:OYbFe>");
assert_eq!(ve("std:chem:parse :OluFe"), "$<Chem:OLuFe>");
assert_eq!(ve("std:chem:parse :OhfFe"), "$<Chem:OHfFe>");
assert_eq!(ve("std:chem:parse :OtaFe"), "$<Chem:OTaFe>");
assert_eq!(ve("std:chem:parse :OwFe"), "$<Chem:OWFe>");
assert_eq!(ve("std:chem:parse :OreFe"), "$<Chem:OReFe>");
assert_eq!(ve("std:chem:parse :OosFe"), "$<Chem:OOsFe>");
assert_eq!(ve("std:chem:parse :OirFe"), "$<Chem:OIrFe>");
assert_eq!(ve("std:chem:parse :OptFe"), "$<Chem:OPtFe>");
assert_eq!(ve("std:chem:parse :OauFe"), "$<Chem:OAuFe>");
assert_eq!(ve("std:chem:parse :OhgFe"), "$<Chem:OHgFe>");
assert_eq!(ve("std:chem:parse :OtlFe"), "$<Chem:OTlFe>");
assert_eq!(ve("std:chem:parse :OpbFe"), "$<Chem:OPbFe>");
assert_eq!(ve("std:chem:parse :ObiFe"), "$<Chem:OBiFe>");
assert_eq!(ve("std:chem:parse :OpoFe"), "$<Chem:OPoFe>");
assert_eq!(ve("std:chem:parse :OatFe"), "$<Chem:OAtFe>");
assert_eq!(ve("std:chem:parse :OrnFe"), "$<Chem:ORnFe>");
assert_eq!(ve("std:chem:parse :OfrFe"), "$<Chem:OFrFe>");
assert_eq!(ve("std:chem:parse :OraFe"), "$<Chem:ORaFe>");
assert_eq!(ve("std:chem:parse :OacFe"), "$<Chem:OAcFe>");
assert_eq!(ve("std:chem:parse :OthFe"), "$<Chem:OThFe>");
assert_eq!(ve("std:chem:parse :OpaFe"), "$<Chem:OPaFe>");
assert_eq!(ve("std:chem:parse :OuFe"), "$<Chem:OUFe>");
assert_eq!(ve("std:chem:parse :OnpFe"), "$<Chem:ONpFe>");
assert_eq!(ve("std:chem:parse :OpuFe"), "$<Chem:OPuFe>");
assert_eq!(ve("std:chem:parse :OamFe"), "$<Chem:OAmFe>");
assert_eq!(ve("std:chem:parse :OcmFe"), "$<Chem:OCmFe>");
assert_eq!(ve("std:chem:parse :ObkFe"), "$<Chem:OBkFe>");
assert_eq!(ve("std:chem:parse :OcfFe"), "$<Chem:OCfFe>");
assert_eq!(ve("std:chem:parse :OesFe"), "$<Chem:OEsFe>");
assert_eq!(ve("std:chem:parse :OfmFe"), "$<Chem:OFmFe>");
assert_eq!(ve("std:chem:parse :OmdFe"), "$<Chem:OMdFe>");
assert_eq!(ve("std:chem:parse :OnoFe"), "$<Chem:ONoFe>");
assert_eq!(ve("std:chem:parse :OlrFe"), "$<Chem:OLrFe>");
assert_eq!(ve("std:chem:parse :OrfFe"), "$<Chem:ORfFe>");
assert_eq!(ve("std:chem:parse :OdbFe"), "$<Chem:ODbFe>");
assert_eq!(ve("std:chem:parse :OSgFe"), "$<Chem:OSgFe>");
assert_eq!(ve("std:chem:parse :ObhFe"), "$<Chem:OBhFe>");
assert_eq!(ve("std:chem:parse :OhsFe"), "$<Chem:OHsFe>");
assert_eq!(ve("std:chem:parse :OmtFe"), "$<Chem:OMtFe>");
assert_eq!(ve("std:chem:parse :OdsFe"), "$<Chem:ODsFe>");
assert_eq!(ve("std:chem:parse :OrgFe"), "$<Chem:ORgFe>");
assert_eq!(ve("std:chem:parse :OcnFe"), "$<Chem:OCnFe>");
assert_eq!(ve("std:chem:parse :OnhFe"), "$<Chem:ONhFe>");
assert_eq!(ve("std:chem:parse :OflFe"), "$<Chem:OFlFe>");
assert_eq!(ve("std:chem:parse :OmcFe"), "$<Chem:OMcFe>");
assert_eq!(ve("std:chem:parse :OlvFe"), "$<Chem:OLvFe>");
assert_eq!(ve("std:chem:parse :OtsFe"), "$<Chem:OTsFe>");
assert_eq!(ve("std:chem:parse :OogFe"), "$<Chem:OOgFe>");
assert_eq!(ve("(std:chem:parse :H2OFe3).canonical_hill[]"), "$<Chem:Fe3H2O>");
assert_eq!(ve("(std:chem:parse :H2Fe3O).canonical[]"), "$<Chem:H2OFe3>");
assert_eq!(ve("(std:chem:parse :H2Fe3O).canonical[]"), "$<Chem:H2OFe3>");
assert_eq!(ve(r#"!sum_formula = std:chem:parse "c14 (h19)2 n o2 cl h"; $@i sum_formula.for_each_element \$+ _2.atomic_mass * _1"#), "?");
}

Loading…
Cancel
Save