From e30810c99708d4baaf7ca06563c0a06eea29cb0f Mon Sep 17 00:00:00 2001 From: Kasper Date: Tue, 6 Jul 2021 07:17:43 +0200 Subject: [PATCH] Add tests by @djmattyg007 --- src/lexer.rs | 175 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 167 insertions(+), 8 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index 9557f08..39a8693 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -782,21 +782,180 @@ mod tests { #[test] fn test_lex() { pub fn run_lex(input: &str, expected_tokens: Vec) { - let tokens = lex(input, false, Unit::Celsius).unwrap(); - let matching_tokens = tokens.iter().zip(&expected_tokens).filter(|&(a, b)| a == b); - assert_eq!(matching_tokens.count(), expected_tokens.len()); + let tokens = match lex(input, false, Unit::Celsius) { + Ok(tokens) => tokens, + Err(e) => { + panic!("lex error: {}\nrun_lex input: {}", e, input); + } + }; + if tokens != expected_tokens { + panic!("tokens mismatch: run_lex input: {}\nexpected: {:?}\nreceived: {:?}", input, expected_tokens, tokens); + } } - run_lex("42 millilitres", vec![numtok!(42), Token::Unit(Milliliter)]); - run_lex("50 / 10", vec![numtok!(50), Token::Operator(Divide), numtok!(10)]); - run_lex("33.3 square meters", vec![numtok!(33.3), Token::Unit(SquareMeter)]); + run_lex("88 kilometres * 2", vec![numtok!(88), Token::Unit(Kilometer), Token::Operator(Multiply), numtok!(2)]); + run_lex("100 nmi", vec![numtok!(100), Token::Unit(NauticalMile)]); run_lex("101 nautical miles", vec![numtok!(101), Token::Unit(NauticalMile)]); - run_lex("87 sq miles", vec![numtok!(87), Token::Unit(SquareMile)]); + run_lex("2 lightyears", vec![numtok!(2), Token::Unit(LightYear)]); run_lex("1 light year", vec![numtok!(1), Token::Unit(LightYear)]); + run_lex("10 lightsec", vec![numtok!(10), Token::Unit(LightSecond)]); + run_lex("12 light secs", vec![numtok!(12), Token::Unit(LightSecond)]); + run_lex("33.3 square meters", vec![numtok!(33.3), Token::Unit(SquareMeter)]); + run_lex("54 m2", vec![numtok!(54), Token::Unit(SquareMeter)]); + run_lex("87 sq miles", vec![numtok!(87), Token::Unit(SquareMile)]); + run_lex("500 feet2", vec![numtok!(500), Token::Unit(SquareFoot)]); + run_lex("500 feet²", vec![numtok!(500), Token::Unit(SquareFoot)]); + run_lex("4 cubic metres", vec![numtok!(4), Token::Unit(CubicMeter)]); run_lex("34 cubic feet + 23 cubic yards", vec![numtok!(34), Token::Unit(CubicFoot), Token::Operator(Plus), numtok!(23), Token::Unit(CubicYard)]); - run_lex("50 metric tonnes", vec![numtok!(50), Token::Unit(MetricTon)]); + run_lex("66 inches3 + 65 millimetre³", vec![numtok!(66), Token::Unit(CubicInch), Token::Operator(Plus), numtok!(65), Token::Unit(CubicMillimeter)]); + run_lex("66 inches³ + 65 millimetre3", vec![numtok!(66), Token::Unit(CubicInch), Token::Operator(Plus), numtok!(65), Token::Unit(CubicMillimeter)]); + run_lex("42 millilitres", vec![numtok!(42), Token::Unit(Milliliter)]); + run_lex("3 tbs", vec![numtok!(3), Token::Unit(Tablespoon)]); + run_lex("6 floz", vec![numtok!(6), Token::Unit(FluidOunce)]); + run_lex("6 fl oz", vec![numtok!(6), Token::Unit(FluidOunce)]); + run_lex("6 fluid ounces", vec![numtok!(6), Token::Unit(FluidOunce)]); + run_lex("3 oil barrels", vec![numtok!(3), Token::Unit(OilBarrel)]); + run_lex("67 kg", vec![numtok!(67), Token::Unit(Kilogram)]); + run_lex("34 oz", vec![numtok!(34), Token::Unit(Ounce)]); + run_lex("34 ounces", vec![numtok!(34), Token::Unit(Ounce)]); + run_lex("210 lb", vec![numtok!(210), Token::Unit(Pound)]); + run_lex("210 lbs", vec![numtok!(210), Token::Unit(Pound)]); + run_lex("210 pound", vec![numtok!(210), Token::Unit(Pound)]); + run_lex("210 pounds", vec![numtok!(210), Token::Unit(Pound)]); + run_lex("210 pounds-force", vec![numtok!(210), Token::LexerKeyword(PoundForce)]); + run_lex("3 ton", vec![numtok!(3), Token::Unit(ShortTon)]); + run_lex("3 short tons", vec![numtok!(3), Token::Unit(ShortTon)]); + run_lex("4 lt", vec![numtok!(4), Token::Unit(LongTon)]); + run_lex("4 long tonnes", vec![numtok!(4), Token::Unit(LongTon)]); + run_lex("234 wh", vec![numtok!(234), Token::Unit(WattHour)]); + run_lex("1 w", vec![numtok!(1), Token::Unit(Watt)]); + run_lex("1 watt", vec![numtok!(1), Token::Unit(Watt)]); + run_lex("1 watts", vec![numtok!(1), Token::Unit(Watt)]); + run_lex("1 watt hour", vec![numtok!(1), Token::Unit(WattHour)]); + run_lex("0 watt + 1 watts", vec![numtok!(0), Token::Unit(Watt), Token::Operator(Plus), numtok!(1), Token::Unit(Watt)]); + run_lex("0 watt * 1", vec![numtok!(0), Token::Unit(Watt), Token::Operator(Multiply), numtok!(1)]); + run_lex("2 watts + 3 watts", vec![numtok!(2), Token::Unit(Watt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 watts * 3", vec![numtok!(2), Token::Unit(Watt), Token::Operator(Multiply), numtok!(3)]); + run_lex("4 watt plus 5 watts", vec![numtok!(4), Token::Unit(Watt), Token::Operator(Plus), numtok!(5), Token::Unit(Watt)]); + run_lex("4 watt times 5", vec![numtok!(4), Token::Unit(Watt), Token::Operator(Multiply), numtok!(5)]); + run_lex("6 watts plus 7 watts", vec![numtok!(6), Token::Unit(Watt), Token::Operator(Plus), numtok!(7), Token::Unit(Watt)]); + run_lex("6 watts times 7", vec![numtok!(6), Token::Unit(Watt), Token::Operator(Multiply), numtok!(7)]); + run_lex("2.3 kwh", vec![numtok!(2.3), Token::Unit(KilowattHour)]); + run_lex("1 kw", vec![numtok!(1), Token::Unit(Kilowatt)]); + run_lex("1 kilowatt", vec![numtok!(1), Token::Unit(Kilowatt)]); + run_lex("1 kilowatts", vec![numtok!(1), Token::Unit(Kilowatt)]); + run_lex("1 kilowatt hour", vec![numtok!(1), Token::Unit(KilowattHour)]); + run_lex("2 kilowatt + 3 watt", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 kilowatt * 4", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Multiply), numtok!(4)]); + run_lex("2 kilowatt times 4", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Multiply), numtok!(4)]); + run_lex("2 kilowatt + 3 watts", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 kilowatts + 3 watt", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 kilowatts + 3 watts", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 kilowatt plus 3 watt", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 kilowatt plus 3 watts", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 kilowatts plus 3 watt", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 kilowatts plus 3 watts", vec![numtok!(2), Token::Unit(Kilowatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("6.6 watts + 4 kilowatts", vec![numtok!(6.6), Token::Unit(Watt), Token::Operator(Plus), numtok!(4), Token::Unit(Kilowatt)]); + run_lex("6.6 watts plus 4 kilowatts", vec![numtok!(6.6), Token::Unit(Watt), Token::Operator(Plus), numtok!(4), Token::Unit(Kilowatt)]); + run_lex("2.3 mwh", vec![numtok!(2.3), Token::Unit(MegawattHour)]); + run_lex("1 mw", vec![numtok!(1), Token::Unit(Megawatt)]); + run_lex("1 megawatt", vec![numtok!(1), Token::Unit(Megawatt)]); + run_lex("1 megawatt hour", vec![numtok!(1), Token::Unit(MegawattHour)]); + run_lex("2 megawatt + 3 watt", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 megawatt * 6", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Multiply), numtok!(6)]); + run_lex("2 megawatt times 6", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Multiply), numtok!(6)]); + run_lex("2 megawatt + 3 watts", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 megawatts + 3 watt", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 megawatts + 3 watts", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 megawatt plus 3 watt", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 megawatt plus 3 watts", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 megawatts plus 3 watt", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("2 megawatts plus 3 watts", vec![numtok!(2), Token::Unit(Megawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Watt)]); + run_lex("6.6 watts + 4 megawatts", vec![numtok!(6.6), Token::Unit(Watt), Token::Operator(Plus), numtok!(4), Token::Unit(Megawatt)]); + run_lex("6.6 watts plus 4 megawatts", vec![numtok!(6.6), Token::Unit(Watt), Token::Operator(Plus), numtok!(4), Token::Unit(Megawatt)]); + run_lex("234 gwh", vec![numtok!(234), Token::Unit(GigawattHour)]); + run_lex("1 gw", vec![numtok!(1), Token::Unit(Gigawatt)]); + run_lex("1 gigawatt", vec![numtok!(1), Token::Unit(Gigawatt)]); + run_lex("1 gigawatts", vec![numtok!(1), Token::Unit(Gigawatt)]); + run_lex("1 gigawatt hour", vec![numtok!(1), Token::Unit(GigawattHour)]); + run_lex("0 gigawatt + 1 gigawatts", vec![numtok!(0), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(1), Token::Unit(Gigawatt)]); + run_lex("0 gigawatt * 1", vec![numtok!(0), Token::Unit(Gigawatt), Token::Operator(Multiply), numtok!(1)]); + run_lex("2 gigawatts + 3 gigawatts", vec![numtok!(2), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(3), Token::Unit(Gigawatt)]); + run_lex("2 gigawatts * 3", vec![numtok!(2), Token::Unit(Gigawatt), Token::Operator(Multiply), numtok!(3)]); + run_lex("4 gigawatt plus 5 watt", vec![numtok!(4), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(5), Token::Unit(Watt)]); + run_lex("4 gigawatt plus 5 megawatt", vec![numtok!(4), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(5), Token::Unit(Megawatt)]); + run_lex("4 gigawatt plus 5 gigawatt", vec![numtok!(4), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(5), Token::Unit(Gigawatt)]); + run_lex("4 gigawatt plus 5 watts", vec![numtok!(4), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(5), Token::Unit(Watt)]); + run_lex("4 gigawatt plus 5 megawatts", vec![numtok!(4), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(5), Token::Unit(Megawatt)]); + run_lex("4 gigawatt plus 5 gigawatts", vec![numtok!(4), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(5), Token::Unit(Gigawatt)]); + run_lex("4 gigawatt times 5", vec![numtok!(4), Token::Unit(Gigawatt), Token::Operator(Multiply), numtok!(5)]); + run_lex("6 gigawatts plus 7 watt", vec![numtok!(6), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(7), Token::Unit(Watt)]); + run_lex("6 gigawatts plus 7 megawatt", vec![numtok!(6), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(7), Token::Unit(Megawatt)]); + run_lex("6 gigawatts plus 7 gigawatt", vec![numtok!(6), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(7), Token::Unit(Gigawatt)]); + run_lex("6 gigawatts plus 7 watts", vec![numtok!(6), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(7), Token::Unit(Watt)]); + run_lex("6 gigawatts plus 7 megawatts", vec![numtok!(6), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(7), Token::Unit(Megawatt)]); + run_lex("6 gigawatts plus 7 gigawatts", vec![numtok!(6), Token::Unit(Gigawatt), Token::Operator(Plus), numtok!(7), Token::Unit(Gigawatt)]); + run_lex("6 gigawatts times 7", vec![numtok!(6), Token::Unit(Gigawatt), Token::Operator(Multiply), numtok!(7)]); + run_lex("88 mw * 3", vec![numtok!(88), Token::Unit(Megawatt), Token::Operator(Multiply), numtok!(3)]); + run_lex("88 mw times 3", vec![numtok!(88), Token::Unit(Megawatt), Token::Operator(Multiply), numtok!(3)]); + run_lex("999 kb", vec![numtok!(999), Token::Unit(Kilobyte)]); + run_lex("200 gb - 100 mb", vec![numtok!(200), Token::Unit(Gigabyte), Token::Operator(Minus), numtok!(100), Token::Unit(Megabyte)]); + run_lex("999 kib", vec![numtok!(999), Token::Unit(Kibibyte)]); + run_lex("200 gib - 100 mib", vec![numtok!(200), Token::Unit(Gibibyte), Token::Operator(Minus), numtok!(100), Token::Unit(Mebibyte)]); + run_lex("45 btu", vec![numtok!(45), Token::Unit(BritishThermalUnit)]); + run_lex("45.5 british thermal unit", vec![numtok!(45.5), Token::Unit(BritishThermalUnit)]); + run_lex("46 british thermal units", vec![numtok!(46), Token::Unit(BritishThermalUnit)]); run_lex("5432 newton metres", vec![numtok!(5432), Token::Unit(NewtonMeter)]); run_lex("2345 newton-meters", vec![numtok!(2345), Token::Unit(NewtonMeter)]); + run_lex("20 lbf", vec![numtok!(20), Token::LexerKeyword(PoundForce)]); + run_lex("60 hz", vec![numtok!(60), Token::Unit(Hertz)]); + run_lex("1100 rpm", vec![numtok!(1100), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1150 revolutions per minute", vec![numtok!(1150), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1 revolution per min", vec![numtok!(1), Token::Unit(RevolutionsPerMinute)]); + // run_lex("4 revolution / mins", vec![numtok!(4), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1250 r / min", vec![numtok!(1250), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1300 rev / min", vec![numtok!(1300), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1350 rev / minute", vec![numtok!(1350), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1250 r per min", vec![numtok!(1250), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1300 rev per min", vec![numtok!(1300), Token::Unit(RevolutionsPerMinute)]); + // run_lex("1350 rev per minute", vec![numtok!(1350), Token::Unit(RevolutionsPerMinute)]); + run_lex("100 kph", vec![numtok!(100), Token::Unit(KilometersPerHour)]); + run_lex("100 kmh", vec![numtok!(100), Token::Unit(KilometersPerHour)]); + run_lex("100 kilometers per hour", vec![numtok!(100), Token::Unit(KilometersPerHour)]); + run_lex("100 kilometre / hrs", vec![numtok!(100), Token::Unit(KilometersPerHour)]); + run_lex("3.6 mps", vec![numtok!(3.6), Token::Unit(MetersPerSecond)]); + run_lex("3.6 meters per second", vec![numtok!(3.6), Token::Unit(MetersPerSecond)]); + run_lex("3.6 metre / secs", vec![numtok!(3.6), Token::Unit(MetersPerSecond)]); + run_lex("60 mph", vec![numtok!(60), Token::Unit(MilesPerHour)]); + run_lex("60 miles per hour", vec![numtok!(60), Token::Unit(MilesPerHour)]); + run_lex("60 mile / hr", vec![numtok!(60), Token::Unit(MilesPerHour)]); + run_lex("35 fps", vec![numtok!(35), Token::Unit(FeetPerSecond)]); + run_lex("35 ft / sec", vec![numtok!(35), Token::Unit(FeetPerSecond)]); + run_lex("35 ft per seconds", vec![numtok!(35), Token::Unit(FeetPerSecond)]); + run_lex("35 foot / secs", vec![numtok!(35), Token::Unit(FeetPerSecond)]); + run_lex("35 foot per seconds", vec![numtok!(35), Token::Unit(FeetPerSecond)]); + run_lex("35 feet / sec", vec![numtok!(35), Token::Unit(FeetPerSecond)]); + run_lex("35 feet per second", vec![numtok!(35), Token::Unit(FeetPerSecond)]); + run_lex("30 pa", vec![numtok!(30), Token::Unit(Pascal)]); + run_lex("23 celsius + 4 celsius", vec![numtok!(23), Token::Unit(Celsius), Token::Operator(Plus), numtok!(4), Token::Unit(Celsius)]); + run_lex("54 f - 1.5 fahrenheit", vec![numtok!(54), Token::Unit(Fahrenheit), Token::Operator(Minus), numtok!(1.5), Token::Unit(Fahrenheit)]); + run_lex("50 metric tonnes", vec![numtok!(50), Token::Unit(MetricTon)]); + run_lex("77 metric hps", vec![numtok!(77), Token::Unit(MetricHorsepower)]); + + run_lex("100 + 99", vec![numtok!(100), Token::Operator(Plus), numtok!(99)]); + run_lex("100 plus 99", vec![numtok!(100), Token::Operator(Plus), numtok!(99)]); + run_lex("12 - 4", vec![numtok!(12), Token::Operator(Minus), numtok!(4)]); + run_lex("12 minus 4", vec![numtok!(12), Token::Operator(Minus), numtok!(4)]); + run_lex("50.5 * 2", vec![numtok!(50.5), Token::Operator(Multiply), numtok!(2)]); + run_lex("50.5 times 2", vec![numtok!(50.5), Token::Operator(Multiply), numtok!(2)]); + // run_lex("50.5 multiplied by 2", vec![numtok!(50.5), Token::Operator(Multiply), numtok!(2)]); + run_lex("6 / 3", vec![numtok!(6), Token::Operator(Divide), numtok!(3)]); + run_lex("50 / 10", vec![numtok!(50), Token::Operator(Divide), numtok!(10)]); + // run_lex("6 divided by 3", vec![numtok!(6), Token::Operator(Divide), numtok!(3)]); + run_lex("7 mod 5", vec![numtok!(7), Token::Operator(Modulo), numtok!(5)]); + + run_lex("(2 + 3) * 4", vec![Token::Operator(LeftParen), numtok!(2), Token::Operator(Plus), numtok!(3), Token::Operator(RightParen), Token::Operator(Multiply), numtok!(4)]); + run_lex("52 weeks * (12 hrs + 12 hours)", vec![numtok!(52), Token::Unit(Week), Token::Operator(Multiply), Token::Operator(LeftParen), numtok!(12), Token::Unit(Hour), Token::Operator(Plus), numtok!(12), Token::Unit(Hour), Token::Operator(RightParen)]); run_lex("12 pound+", vec![numtok!(12), Token::Unit(Pound), Token::Operator(Plus)]); } }