#![allow(clippy::type_complexity)]
use crate::common::error::WhammError;
use crate::parser::tests::setup_logger;
use crate::parser::types::{Expr, NumLit, Rule, Value, WhammParser};
use crate::parser::whamm_parser::{handle_float, handle_int};
use log::error;
use pest::iterators::Pair;
use pest::Parser;
#[test]
#[rustfmt::skip]
pub fn test_int32s() {
setup_logger();
let s = test_i32;
let u = test_u32;
u(0, "0", "0x0", "0b0");
u(0, "0", "0x000", "0b0000");
u(0, "0", "0X0", "0B0");
u(0, "0", "0X000", "0B0000");
u(1, "1", "0x1", "0b1");
s(-1, "-1", "0xffffffff", "0b11111111111111111111111111111111");
u(2, "2", "0x2", "0b10");
s(-2, "-2", "0xfffffffe", "0b11111111111111111111111111111110");
u(3, "3", "0x3", "0b11");
s(-3, "-3", "0xfffffffd", "0b11111111111111111111111111111101");
u(4, "4", "0x4", "0b100");
s(-4, "-4", "0xfffffffc", "0b11111111111111111111111111111100");
u(5, "5", "0x5", "0b101");
s(-5, "-5", "0xfffffffb", "0b11111111111111111111111111111011");
s(-6, "-6", "0xfffffffa", "0b11111111111111111111111111111010");
u(6, "6", "0x6", "0b110");
u(7, "7", "0x7", "0b111");
s(-7, "-7", "0xfffffff9", "0b11111111111111111111111111111001");
u(8, "8", "0x8", "0b1000");
s(-8, "-8", "0xfffffff8", "0b11111111111111111111111111111000");
u(9, "9", "0x9", "0b1001");
s(-9, "-9", "0xfffffff7", "0b11111111111111111111111111110111");
u(10, "10", "0xa", "0b1010");
s(-10, "-10", "0xfffffff6", "0b11111111111111111111111111110110");
u(11, "11", "0xb", "0b1011");
s(-11, "-11", "0xfffffff5", "0b11111111111111111111111111110101");
u(12, "12", "0xc", "0b1100");
s(-12, "-12", "0xfffffff4", "0b11111111111111111111111111110100");
u(13, "13", "0xd", "0b1101");
s(-13, "-13", "0xfffffff3", "0b11111111111111111111111111110011");
u(14, "14", "0xe", "0b1110");
s(-14, "-14", "0xfffffff2", "0b11111111111111111111111111110010");
u(15, "15", "0xf", "0b1111");
s(-15, "-15", "0xfffffff1", "0b11111111111111111111111111110001");
u(16, "16", "0x10", "0b10000");
s(-16, "-16", "0xfffffff0", "0b11111111111111111111111111110000");
u(17, "17", "0x11", "0b10001");
s(-17, "-17", "0xffffffef", "0b11111111111111111111111111101111");
u(18, "18", "0x12", "0b10010");
s(-18, "-18", "0xffffffee", "0b11111111111111111111111111101110");
u(23, "23", "0x17", "0b10111");
s(-23, "-23", "0xffffffe9", "0b11111111111111111111111111101001");
u(42, "42", "0x2a", "0b101010");
s(-42, "-42", "0xffffffd6", "0b11111111111111111111111111010110");
u(56, "56", "0x38", "0b111000");
s(-56, "-56", "0xffffffc8", "0b11111111111111111111111111001000");
u(1000000000, "1000000000", "0x3b9aca00", "0b111011100110101100101000000000");
u(1000000000, "1000000000", "0x3B9ACA00", "0b111011100110101100101000000000");
u(2000000000, "2000000000", "0x77359400", "0b1110111001101011001010000000000");
u(2000000000, "2000000000", "0x77359400", "0b1110111001101011001010000000000");
u(999999999, "999999999", "0x3b9ac9ff", "0b111011100110101100100111111111");
u(1000000001, "1000000001", "0x3b9aca01", "0b111011100110101100101000000001");
u(1999999999, "1999999999", "0x773593ff", "0b1110111001101011001001111111111");
u(2000000001, "2000000001", "0x77359401", "0b1110111001101011001010000000001");
u(999999998, "999999998", "0x3b9ac9fe", "0b111011100110101100100111111110");
u(1000000002, "1000000002", "0x3b9aca02", "0b111011100110101100101000000010");
u(1999999998, "1999999998", "0x773593fe", "0b1110111001101011001001111111110");
u(2000000002, "2000000002", "0x77359402", "0b1110111001101011001010000000010");
u(999999997, "999999997", "0x3b9ac9fd", "0b111011100110101100100111111101");
u(1000000003, "1000000003", "0x3b9aca03", "0b111011100110101100101000000011");
u(1999999997, "1999999997", "0x773593fd", "0b1110111001101011001001111111101");
u(2000000003, "2000000003", "0x77359403", "0b1110111001101011001010000000011");
u(999999996, "999999996", "0x3b9ac9fc", "0b111011100110101100100111111100");
u(1000000004, "1000000004", "0x3b9aca04", "0b111011100110101100101000000100");
u(1999999996, "1999999996", "0x773593fc", "0b1110111001101011001001111111100");
u(2000000004, "2000000004", "0x77359404", "0b1110111001101011001010000000100");
u(999999995, "999999995", "0x3b9ac9fb", "0b111011100110101100100111111011");
u(1000000005, "1000000005", "0x3b9aca05", "0b111011100110101100101000000101");
u(1999999995, "1999999995", "0x773593fb", "0b1110111001101011001001111111011");
u(2000000005, "2000000005", "0x77359405", "0b1110111001101011001010000000101");
u(999999994, "999999994", "0x3b9ac9fa", "0b111011100110101100100111111010");
u(1000000006, "1000000006", "0x3b9aca06", "0b111011100110101100101000000110");
u(1999999994, "1999999994", "0x773593fa", "0b1110111001101011001001111111010");
u(2000000006, "2000000006", "0x77359406", "0b1110111001101011001010000000110");
u(999999993, "999999993", "0x3b9ac9f9", "0b111011100110101100100111111001");
u(1000000007, "1000000007", "0x3b9aca07", "0b111011100110101100101000000111");
u(1999999993, "1999999993", "0x773593f9", "0b1110111001101011001001111111001");
u(2000000007, "2000000007", "0x77359407", "0b1110111001101011001010000000111");
u(999999992, "999999992", "0x3b9ac9f8", "0b111011100110101100100111111000");
u(1000000008, "1000000008", "0x3b9aca08", "0b111011100110101100101000001000");
u(1999999992, "1999999992", "0x773593f8", "0b1110111001101011001001111111000");
u(2000000008, "2000000008", "0x77359408", "0b1110111001101011001010000001000");
u(999999991, "999999991", "0x3b9ac9f7", "0b111011100110101100100111110111");
u(1000000009, "1000000009", "0x3b9aca09", "0b111011100110101100101000001001");
u(1999999991, "1999999991", "0x773593f7", "0b1110111001101011001001111110111");
u(2000000009, "2000000009", "0x77359409", "0b1110111001101011001010000001001");
u(999999990, "999999990", "0x3b9ac9f6", "0b111011100110101100100111110110");
u(1000000010, "1000000010", "0x3b9aca0a", "0b111011100110101100101000001010");
u(1999999990, "1999999990", "0x773593f6", "0b1110111001101011001001111110110");
u(2000000010, "2000000010", "0x7735940a", "0b1110111001101011001010000001010");
u(999999989, "999999989", "0x3b9ac9f5", "0b111011100110101100100111110101");
u(1000000011, "1000000011", "0x3b9aca0b", "0b111011100110101100101000001011");
u(1999999989, "1999999989", "0x773593f5", "0b1110111001101011001001111110101");
u(2000000011, "2000000011", "0x7735940b", "0b1110111001101011001010000001011");
u(999999988, "999999988", "0x3b9ac9f4", "0b111011100110101100100111110100");
u(1000000012, "1000000012", "0x3b9aca0c", "0b111011100110101100101000001100");
u(1999999988, "1999999988", "0x773593f4", "0b1110111001101011001001111110100");
u(2000000012, "2000000012", "0x7735940c", "0b1110111001101011001010000001100");
u(999999987, "999999987", "0x3b9ac9f3", "0b111011100110101100100111110011");
u(1000000013, "1000000013", "0x3b9aca0d", "0b111011100110101100101000001101");
u(1999999987, "1999999987", "0x773593f3", "0b1110111001101011001001111110011");
u(2000000013, "2000000013", "0x7735940d", "0b1110111001101011001010000001101");
u(999999986, "999999986", "0x3b9ac9f2", "0b111011100110101100100111110010");
u(1000000014, "1000000014", "0x3b9aca0e", "0b111011100110101100101000001110");
u(1999999986, "1999999986", "0x773593f2", "0b1110111001101011001001111110010");
u(2000000014, "2000000014", "0x7735940e", "0b1110111001101011001010000001110");
u(999999985, "999999985", "0x3b9ac9f1", "0b111011100110101100100111110001");
u(1000000015, "1000000015", "0x3b9aca0f", "0b111011100110101100101000001111");
u(1999999985, "1999999985", "0x773593f1", "0b1110111001101011001001111110001");
u(2000000015, "2000000015", "0x7735940f", "0b1110111001101011001010000001111");
u(999999984, "999999984", "0x3b9ac9f0", "0b111011100110101100100111110000");
u(1000000016, "1000000016", "0x3b9aca10", "0b111011100110101100101000010000");
u(1999999984, "1999999984", "0x773593f0", "0b1110111001101011001001111110000");
u(2000000016, "2000000016", "0x77359410", "0b1110111001101011001010000010000");
u(999999983, "999999983", "0x3b9ac9ef", "0b111011100110101100100111101111");
u(1000000017, "1000000017", "0x3b9aca11", "0b111011100110101100101000010001");
u(1999999983, "1999999983", "0x773593ef", "0b1110111001101011001001111101111");
u(2000000017, "2000000017", "0x77359411", "0b1110111001101011001010000010001");
u(999999982, "999999982", "0x3b9ac9ee", "0b111011100110101100100111101110");
u(1000000018, "1000000018", "0x3b9aca12", "0b111011100110101100101000010010");
u(1999999982, "1999999982", "0x773593ee", "0b1110111001101011001001111101110");
u(2000000018, "2000000018", "0x77359412", "0b1110111001101011001010000010010");
u(999999977, "999999977", "0x3b9ac9e9", "0b111011100110101100100111101001");
u(1000000023, "1000000023", "0x3b9aca17", "0b111011100110101100101000010111");
u(1999999977, "1999999977", "0x773593e9", "0b1110111001101011001001111101001");
u(2000000023, "2000000023", "0x77359417", "0b1110111001101011001010000010111");
u(999999958, "999999958", "0x3b9ac9d6", "0b111011100110101100100111010110");
u(1000000042, "1000000042", "0x3b9aca2a", "0b111011100110101100101000101010");
u(1999999958, "1999999958", "0x773593d6", "0b1110111001101011001001111010110");
u(2000000042, "2000000042", "0x7735942a", "0b1110111001101011001010000101010");
u(999999944, "999999944", "0x3b9ac9c8", "0b111011100110101100100111001000");
u(1000000056, "1000000056", "0x3b9aca38", "0b111011100110101100101000111000");
u(1999999944, "1999999944", "0x773593c8", "0b1110111001101011001001111001000");
u(2000000056, "2000000056", "0x77359438", "0b1110111001101011001010000111000");
u(77, "77", "0x4d", "0b1001101");
s(-77, "-77", "0xffffffb3", "0b11111111111111111111111110110011");
u(999999923, "999999923", "0x3b9ac9b3", "0b111011100110101100100110110011");
u(1000000077, "1000000077", "0x3b9aca4d", "0b111011100110101100101001001101");
u(1999999923, "1999999923", "0x773593b3", "0b1110111001101011001001110110011");
u(2000000077, "2000000077", "0x7735944d", "0b1110111001101011001010001001101");
u(101, "101", "0x65", "0b1100101");
s(-101, "-101", "0xffffff9b", "0b11111111111111111111111110011011");
u(999999899, "999999899", "0x3b9ac99b", "0b111011100110101100100110011011");
u(1000000101, "1000000101", "0x3b9aca65", "0b111011100110101100101001100101");
u(1999999899, "1999999899", "0x7735939b", "0b1110111001101011001001110011011");
u(2000000101, "2000000101", "0x77359465", "0b1110111001101011001010001100101");
u(125, "125", "0x7d", "0b1111101");
s(-125, "-125", "0xffffff83", "0b11111111111111111111111110000011");
u(999999875, "999999875", "0x3b9ac983", "0b111011100110101100100110000011");
u(1000000125, "1000000125", "0x3b9aca7d", "0b111011100110101100101001111101");
u(1999999875, "1999999875", "0x77359383", "0b1110111001101011001001110000011");
u(2000000125, "2000000125", "0x7735947d", "0b1110111001101011001010001111101");
u(1001, "1001", "0x3e9", "0b1111101001");
s(-1001, "-1001", "0xfffffc17", "0b11111111111111111111110000010111");
u(999998999, "999998999", "0x3b9ac617", "0b111011100110101100011000010111");
u(1000001001, "1000001001", "0x3b9acde9", "0b111011100110101100110111101001");
u(1999998999, "1999998999", "0x77359017", "0b1110111001101011001000000010111");
u(2000001001, "2000001001", "0x773597e9", "0b1110111001101011001011111101001");
u(1120, "1120", "0x460", "0b10001100000");
s(-1120, "-1120", "0xfffffba0", "0b11111111111111111111101110100000");
u(999998880, "999998880", "0x3b9ac5a0", "0b111011100110101100010110100000");
u(1000001120, "1000001120", "0x3b9ace60", "0b111011100110101100111001100000");
u(1999998880, "1999998880", "0x77358fa0", "0b1110111001101011000111110100000");
u(2000001120, "2000001120", "0x77359860", "0b1110111001101011001100001100000");
u(32767, "32767", "0x7fff", "0b111111111111111");
s(-32767, "-32767", "0xffff8001", "0b11111111111111111000000000000001");
u(999967233, "999967233", "0x3b9a4a01", "0b111011100110100100101000000001");
u(1000032767, "1000032767", "0x3b9b49ff", "0b111011100110110100100111111111");
u(1999967233, "1999967233", "0x77351401", "0b1110111001101010001010000000001");
u(2000032767, "2000032767", "0x773613ff", "0b1110111001101100001001111111111");
u(32768, "32768", "0x8000", "0b1000000000000000");
s(-32768, "-32768", "0xffff8000", "0b11111111111111111000000000000000");
u(999967232, "999967232", "0x3b9a4a00", "0b111011100110100100101000000000");
u(1000032768, "1000032768", "0x3b9b4a00", "0b111011100110110100101000000000");
u(1999967232, "1999967232", "0x77351400", "0b1110111001101010001010000000000");
u(2000032768, "2000032768", "0x77361400", "0b1110111001101100001010000000000");
u(32769, "32769", "0x8001", "0b1000000000000001");
s(-32769, "-32769", "0xffff7fff", "0b11111111111111110111111111111111");
u(999967231, "999967231", "0x3b9a49ff", "0b111011100110100100100111111111");
u(1000032769, "1000032769", "0x3b9b4a01", "0b111011100110110100101000000001");
u(1999967231, "1999967231", "0x773513ff", "0b1110111001101010001001111111111");
u(2000032769, "2000032769", "0x77361401", "0b1110111001101100001010000000001");
u(64000, "64000", "0xfa00", "0b1111101000000000");
s(-64000, "-64000", "0xffff0600", "0b11111111111111110000011000000000");
u(999936000, "999936000", "0x3b99d000", "0b111011100110011101000000000000");
u(1000064000, "1000064000", "0x3b9bc400", "0b111011100110111100010000000000");
u(1999936000, "1999936000", "0x77349a00", "0b1110111001101001001101000000000");
u(2000064000, "2000064000", "0x77368e00", "0b1110111001101101000111000000000");
u(65535, "65535", "0xffff", "0b1111111111111111");
s(-65535, "-65535", "0xffff0001", "0b11111111111111110000000000000001");
u(999934465, "999934465", "0x3b99ca01", "0b111011100110011100101000000001");
u(1000065535, "1000065535", "0x3b9bc9ff", "0b111011100110111100100111111111");
u(1999934465, "1999934465", "0x77349401", "0b1110111001101001001010000000001");
u(2000065535, "2000065535", "0x773693ff", "0b1110111001101101001001111111111");
u(65536, "65536", "0x10000", "0b10000000000000000");
s(-65536, "-65536", "0xffff0000", "0b11111111111111110000000000000000");
u(999934464, "999934464", "0x3b99ca00", "0b111011100110011100101000000000");
u(1000065536, "1000065536", "0x3b9bca00", "0b111011100110111100101000000000");
u(1999934464, "1999934464", "0x77349400", "0b1110111001101001001010000000000");
u(2000065536, "2000065536", "0x77369400", "0b1110111001101101001010000000000");
u(1000982, "1000982", "0xf4616", "0b11110100011000010110");
s(-1000982, "-1000982", "0xfff0b9ea", "0b11111111111100001011100111101010");
u(998999018, "998999018", "0x3b8b83ea", "0b111011100010111000001111101010");
u(1001000982, "1001000982", "0x3baa1016", "0b111011101010100001000000010110");
u(1998999018, "1998999018", "0x77264dea", "0b1110111001001100100110111101010");
u(2001000982, "2001000982", "0x7744da16", "0b1110111010001001101101000010110");
u(2147483647, "2147483647", "0x7fffffff", "0b1111111111111111111111111111111");
u(2147483646, "2147483646", "0x7ffffffe", "0b1111111111111111111111111111110");
s(-2147483648, "-2147483648", "0x80000000", "0b10000000000000000000000000000000");
s(-2147483648, "-2147483648", "0x80000000", "0b10000000000000000000000000000000");
u(2147483647, "2147483647", "0x7fffffff", "0b1111111111111111111111111111111");
s(-2147483647, "-2147483647", "0x80000001", "0b10000000000000000000000000000001");
u(2147483647, "2_147_483_647", "0x7fffffff", "0b1111111111111111111111111111111");
s(-2147483647, "-2_147_483_647", "0x80000001", "0b10000000000000000000000000000001");
u(2147483646, "2147483646", "0x7fFFfffE", "0b1111111111111111111111111111110");
u(999934465, "999934465", "0X3B99CA01", "0B111011100110011100101000000001");
u(1000065535, "1000065535", "0X3B9BC9FF", "0B111011100110111100100111111111");
u(999999997, "999999997", "0X3B9AC9FD", "0B111011100110101100100111111101");
s(-32768, "-32768", "0xFFFF8000", "0b11111111111111111000000000000000");
s(-32767, "-32767", "0xFFFF8001", "0b11111111111111111000000000000001");
s(-65536, "-65536", "0xFFFF0000", "0b11111111111111110000000000000000");
s(-65535, "-65535", "0xFFFF0001", "0b11111111111111110000000000000001");
u(32768, "32768", "0x8000", "0b01000000000000000");
u(32768, "32768", "0x8000", "0b00001000000000000000");
u(32768, "32768", "0x8000", "0b00000000000000001000000000000000");
u(3, "3", "0x3", "0b0011");
u(3, "3", "0x3", "0b000011");
u(3, "3", "0x3", "0b0000011");
u(3, "3", "0x3", "0b0000000011");
}
#[test]
#[rustfmt::skip]
pub fn test_int64s() {
setup_logger();
let t = parse_int;
t(NumLit::i64(0), "0x000000000");
t(NumLit::i64(0), "0x00000000000000");
t(NumLit::i64(0), "0x000000000000000");
t(NumLit::i64(0), "0x0000000000000000");
t(NumLit::i64(1), "0x0000000000000001");
t(NumLit::i64(2), "0x0000000000000002");
t(NumLit::i64(3), "0x0000000000000003");
t(NumLit::i64(4), "0x0000000000000004");
t(NumLit::i64(5), "0x0000000000000005");
t(NumLit::i64(6), "0x0000000000000006");
t(NumLit::i64(7), "0x0000000000000007");
t(NumLit::i64(8), "0x0000000000000008");
t(NumLit::i64(9), "0x0000000000000009");
t(NumLit::i64(10), "0x000000000000000a");
t(NumLit::i64(11), "0x000000000000000b");
t(NumLit::i64(12), "0x000000000000000c");
t(NumLit::i64(13), "0x000000000000000d");
t(NumLit::i64(14), "0x000000000000000e");
t(NumLit::i64(15), "0x000000000000000f");
t(NumLit::i64(1313626124122587136), "0x123aF00000000000");
t(NumLit::i64(-1), "0xFFFFFFFFFFFFFFFF");
t(NumLit::i64(-1), "0xffffffffffffffff");
t(NumLit::i64(4294826559511677440), "0x3b9a4a003b9b4a00");
t(NumLit::i64(8589793856511677440), "0x7735140077361400");
t(NumLit::i64(140746078257151), "0x00008001ffff7fff");
t(NumLit::i64(140746078257151), "0x0008001ffff7fff");
t(NumLit::i64(140746078257151), "0x008001ffff7fff");
t(NumLit::i64(140746078257151), "0x08001ffff7fff");
t(NumLit::i64(140746078257151), "0x8001ffff7fff");
t(NumLit::i64(4294826555216710145), "0x3b9a49ff3b9b4a01");
t(NumLit::i64(8589793852216710145), "0x773513ff77361401");
t(NumLit::i64(274882201847296), "0x0000fa00ffff0600");
t(NumLit::i64(4294692419093120000), "0x3b99d0003b9bc400");
t(NumLit::i64(8589659716093120000), "0x77349a0077368e00");
t(NumLit::i64(281474976645121), "0x0000ffffffff0001");
t(NumLit::i64(4294685826318322175), "0x3b99ca013b9bc9ff");
t(NumLit::i64(8589653123318322175), "0x77349401773693ff");
t(NumLit::i64(281479271612416), "0x00010000ffff0000");
t(NumLit::i64(281479271612416), "0x0010000ffff0000");
t(NumLit::i64(281479271612416), "0x010000ffff0000");
t(NumLit::i64(281479271612416), "0x10000ffff0000");
t(NumLit::i64(4294685822023354880), "0x3b99ca003b9bca00");
t(NumLit::i64(8589653119023354880), "0x7734940077369400");
t(NumLit::i64(4299189247850986), "0x000f4616fff0b9ea");
t(NumLit::i64(4299189247850986), "0x00f4616fff0b9ea");
t(NumLit::i64(4299189247850986), "0x0f4616fff0b9ea");
t(NumLit::i64(4299189247850986), "0xf4616fff0b9ea");
t(NumLit::i64(4290668112047116310), "0x3b8b83ea3baa1016");
t(NumLit::i64(8585635409047116310), "0x77264dea7744da16");
t(NumLit::i64(9223372034707292158), "0x7fffffff7ffffffe");
t(NumLit::i64(-9223372034707292160), "0x8000000080000000");
t(NumLit::i64(9223372034707292161), "0x7fffffff80000001");
t(NumLit::u64(6392438068), "6392438068");
t(NumLit::u64(19177314205), "19177314205");
t(NumLit::u64(57531942616), "57531942616");
t(NumLit::u64(172595827849), "172595827849");
t(NumLit::u64(517787483548), "517787483548");
t(NumLit::u64(1553362450645), "1553362450645");
t(NumLit::u64(4660087351936), "4660087351936");
t(NumLit::u64(13980262055809), "13980262055809");
t(NumLit::u64(41940786167428), "41940786167428");
t(NumLit::u64(125822358502285), "125822358502285");
t(NumLit::u64(377467075506856), "377467075506856");
t(NumLit::u64(1132401226520569), "1132401226520569");
t(NumLit::u64(3397203679561708), "3397203679561708");
t(NumLit::u64(10191611038685125), "10191611038685125");
t(NumLit::u64(30574833116055376), "30574833116055376");
t(NumLit::u64(91724499348166129), "91724499348166129");
t(NumLit::u64(275173498044498388), "275173498044498388");
t(NumLit::u64(825520494133495165), "825520494133495165");
t(NumLit::u64(825520494133495165), "825520494133495165");
t(NumLit::u64(825520494133495165), "825520494133495165");
t(NumLit::u64(3842309267894817852), "3842309267894817852");
t(NumLit::u64(3842309267894817852), "3_842_309_267_894_817_852");
t(NumLit::i64(-15690529805), "-15690529805");
t(NumLit::i64(-47071589414), "-47071589414");
t(NumLit::i64(-141214768241), "-141214768241");
t(NumLit::i64(-423644304722), "-423644304722");
t(NumLit::i64(-1270932914165), "-1270932914165");
t(NumLit::i64(-3812798742494), "-3812798742494");
t(NumLit::i64(-11438396227481), "-11438396227481");
t(NumLit::i64(-34315188682442), "-34315188682442");
t(NumLit::i64(-102945566047325), "-102945566047325");
t(NumLit::i64(-308836698141974), "-308836698141974");
t(NumLit::i64(-926510094425921), "-926510094425921");
t(NumLit::i64(-2779530283277762), "-2779530283277762");
t(NumLit::i64(-8338590849833285), "-8338590849833285");
t(NumLit::i64(-25015772549499854), "-25015772549499854");
t(NumLit::i64(-75047317648499561), "-75047317648499561");
t(NumLit::i64(-225141952945498682), "-225141952945498682");
t(NumLit::i64(-675425858836496045), "-675425858836496045");
t(NumLit::i64(-2026277576509488134), "-2026277576509488134");
t(NumLit::i64(-6078832729528464401), "-6078832729528464401");
t(NumLit::i64(-6078832729528464401), "-6_078_832_729_528_464_401");
t(NumLit::u64(9223372036854775807), "9223372036854775807");
t(NumLit::i64(-9223372036854775808), "-9223372036854775808");
t(NumLit::i64(0x00000FA9), "0b0000000000000000000000000000111110101001");
t(NumLit::i64(0x00002EFC), "0b00000000000000000000000000000010111011111100");
t(NumLit::i64(0x00008CF5), "0b00000000000000000000000000000001000110011110101");
t(NumLit::i64(0x0001A6E0), "0b00000000000000000000000000011010011011100000");
t(NumLit::i64(0x0004F4A1), "0b0000000000000000000000000000001001111010010100001");
t(NumLit::i64(0x000EDDE4), "0b000000000000000000000000000000011101101110111100100");
t(NumLit::i64(0x002C99AD), "0b00000000000000000000000000000001011001001100110101101");
t(NumLit::i64(0x0085CD08), "0b000000000000000000000000000000100001011100110100001000");
t(NumLit::i64(0x01916719), "0b00000000000000000000000000001100100010110011100011001");
t(NumLit::i64(0x04B4354C), "0b00000000000000000000100101101000011010101001100");
t(NumLit::i64(0x0E1C9FE5), "0b000000000000000001110000111001001111111100101");
t(NumLit::i64(0x00000005), "0b0000000000000000000000000000000000000000000000000000000000000101");
t(NumLit::i64(0x00000010), "0b0000000000000000000000000000000000000000000000000000000000010000");
t(NumLit::i64(0x00000031), "0b0000000000000000000000000000000000000000000000000000000000110001");
t(NumLit::i64(0x00000094), "0b0000000000000000000000000000000000000000000000000000000010010100");
t(NumLit::i64(0x000001BD), "0b0000000000000000000000000000000000000000000000000000000110111101");
t(NumLit::i64(0x00000538), "0b0000000000000000000000000000000000000000000000000000010100111000");
t(NumLit::i64(0x00000FA9), "0b0000000000000000000000000000000000000000000000000000111110101001");
t(NumLit::i64(0x00002EFC), "0b0000000000000000000000000000000000000000000000000010111011111100");
t(NumLit::i64(0x00008CF5), "0b0000000000000000000000000000000000000000000000001000110011110101");
t(NumLit::i64(0x0001A6E0), "0b0000000000000000000000000000000000000000000000011010011011100000");
t(NumLit::i64(0x0004F4A1), "0b0000000000000000000000000000000000000000000001001111010010100001");
t(NumLit::i64(0x000EDDE4), "0b0000000000000000000000000000000000000000000011101101110111100100");
t(NumLit::i64(0x002C99AD), "0b0000000000000000000000000000000000000000001011001001100110101101");
t(NumLit::i64(0x0085CD08), "0b0000000000000000000000000000000000000000100001011100110100001000");
t(NumLit::i64(0x01916719), "0b0000000000000000000000000000000000000001100100010110011100011001");
t(NumLit::i64(0x04B4354C), "0b0000000000000000000000000000000000000100101101000011010101001100");
t(NumLit::i64(0x0E1C9FE5), "0b0000000000000000000000000000000000001110000111001001111111100101");
t(NumLit::i64(0x2A55DFB0), "0b0000000000000000000000000000000000101010010101011101111110110000");
t(NumLit::i64(0x7F019F11), "0b0000000000000000000000000000000001111111000000011001111100010001");
t(NumLit::i64(0x000000017D04DD34), "0b0000000000000000000000000000000101111101000001001101110100110100");
t(NumLit::i64(0x00000004770E979D), "0b0000000000000000000000000000010001110111000011101001011110011101");
t(NumLit::i64(0x0000000D652BC6D8), "0b0000000000000000000000000000110101100101001010111100011011011000");
t(NumLit::i64(0x000000282F835489), "0b0000000000000000000000000010100000101111100000110101010010001001");
t(NumLit::i64(0x000000788E89FD9C), "0b0000000000000000000000000111100010001110100010011111110110011100");
t(NumLit::i64(0x00000169AB9DF8D5), "0b0000000000000000000000010110100110101011100111011111100011010101");
t(NumLit::i64(0x0000043D02D9EA80), "0b0000000000000000000001000011110100000010110110011110101010000000");
t(NumLit::i64(0x00000CB7088DBF81), "0b0000000000000000000011001011011100001000100011011011111110000001");
t(NumLit::i64(0x0000262519A93E84), "0b0000000000000000001001100010010100011001101010010011111010000100");
t(NumLit::i64(0x0000726F4CFBBB8D), "0b0000000000000000011100100110111101001100111110111011101110001101");
t(NumLit::i64(0x0001574DE6F332A8), "0b0000000000000001010101110100110111100110111100110011001010101000");
t(NumLit::i64(0x000405E9B4D997F9), "0b0000000000000100000001011110100110110100110110011001011111111001");
t(NumLit::i64(0x000C11BD1E8CC7EC), "0b0000000000001100000100011011110100011110100011001100011111101100");
t(NumLit::i64(0x002435375BA657C5), "0b0000000000100100001101010011011101011011101001100101011111000101");
t(NumLit::i64(0x006C9FA612F30750), "0b0000000001101100100111111010011000010010111100110000011101010000");
t(NumLit::i64(0x0145DEF238D915F1), "0b0000000101000101110111101111001000111000110110010001010111110001");
t(NumLit::i64(0x03D19CD6AA8B41D4), "0b0000001111010001100111001101011010101010100010110100000111010100");
t(NumLit::i64(0x0B74D683FFA1C57D), "0b0000101101110100110101101000001111111111101000011100010101111101");
t(NumLit::i64(0x225E838BFEE55078), "0b0010001001011110100000111000101111111110111001010101000001111000");
t(NumLit::i64(0x671B8AA3FCAFF169), "0b0110011100011011100010101010001111111100101011111111000101101001");
t(NumLit::i64(0x35529FEBF60FD43C), "0b0011010101010010100111111110101111110110000011111101010000111100");
t(NumLit::i64(0xFFFFFFFFFFFFFFFEu64 as i64), "0b1111111111111111111111111111111111111111111111111111111111111110");
t(NumLit::i64(0xFFFFFFFFFFFFFFFBu64 as i64), "0b1111111111111111111111111111111111111111111111111111111111111011");
t(NumLit::i64(0xFFFFFFFFFFFFFFF2u64 as i64), "0b1111111111111111111111111111111111111111111111111111111111110010");
t(NumLit::i64(0xFFFFFFFFFFFFFFD7u64 as i64), "0b1111111111111111111111111111111111111111111111111111111111010111");
t(NumLit::i64(0xFFFFFFFFFFFFFF86u64 as i64), "0b1111111111111111111111111111111111111111111111111111111110000110");
t(NumLit::i64(0xFFFFFFFFFFFFFE93u64 as i64), "0b1111111111111111111111111111111111111111111111111111111010010011");
t(NumLit::i64(0xFFFFFFFFFFFFFBBAu64 as i64), "0b1111111111111111111111111111111111111111111111111111101110111010");
t(NumLit::i64(0xFFFFFFFFFFFFF32Fu64 as i64), "0b1111111111111111111111111111111111111111111111111111001100101111");
t(NumLit::i64(0xFFFFFFFFFFFFD98Eu64 as i64), "0b1111111111111111111111111111111111111111111111111101100110001110");
t(NumLit::i64(0xFFFFFFFFFFFF8CABu64 as i64), "0b1111111111111111111111111111111111111111111111111000110010101011");
t(NumLit::i64(0xFFFFFFFFFFFEA602u64 as i64), "0b1111111111111111111111111111111111111111111111101010011000000010");
t(NumLit::i64(0xFFFFFFFFFFFBF207u64 as i64), "0b1111111111111111111111111111111111111111111110111111001000000111");
t(NumLit::i64(0xFFFFFFFFFFF3D616u64 as i64), "0b1111111111111111111111111111111111111111111100111101011000010110");
t(NumLit::i64(0xFFFFFFFFFFDB8243u64 as i64), "0b1111111111111111111111111111111111111111110110111000001001000011");
t(NumLit::i64(0xFFFFFFFFFF9286CAu64 as i64), "0b1111111111111111111111111111111111111111100100101000011011001010");
t(NumLit::i64(0xFFFFFFFFFEB7945Fu64 as i64), "0b1111111111111111111111111111111111111110101101111001010001011111");
t(NumLit::i64(0xFFFFFFFFFC26BD1Eu64 as i64), "0b1111111111111111111111111111111111111100001001101011110100011110");
t(NumLit::i64(0xFFFFFFFFF474375Bu64 as i64), "0b1111111111111111111111111111111111110100011101000011011101011011");
t(NumLit::i64(0xFFFFFFFFDD5CA612u64 as i64), "0b1111111111111111111111111111111111011101010111001010011000010010");
t(NumLit::i64(0xFFFFFFFF9815F237u64 as i64), "0b1111111111111111111111111111111110011000000101011111001000110111");
t(NumLit::i64(0xFFFFFFFEC841D6A6u64 as i64), "0b1111111111111111111111111111111011001000010000011101011010100110");
t(NumLit::i64(0xFFFFFFFC58C583F3u64 as i64), "0b1111111111111111111111111111110001011000110001011000001111110011");
t(NumLit::i64(0xFFFFFFF50A508BDAu64 as i64), "0b1111111111111111111111111111010100001010010100001000101111011010");
t(NumLit::i64(0xFFFFFFDF1EF1A38Fu64 as i64), "0b1111111111111111111111111101111100011110111100011010001110001111");
t(NumLit::i64(0xFFFFFF9D5CD4EAAEu64 as i64), "0b1111111111111111111111111001110101011100110101001110101010101110");
t(NumLit::i64(0xFFFFFED8167EC00Bu64 as i64), "0b1111111111111111111111101101100000010110011111101100000000001011");
t(NumLit::i64(0xFFFFFC88437C4022u64 as i64), "0b1111111111111111111111001000100001000011011111000100000000100010");
t(NumLit::i64(0xFFFFF598CA74C067u64 as i64), "0b1111111111111111111101011001100011001010011101001100000001100111");
t(NumLit::i64(0xFFFFE0CA5F5E4136u64 as i64), "0b1111111111111111111000001100101001011111010111100100000100110110");
t(NumLit::i64(0xFFFFA25F1E1AC3A3u64 as i64), "0b1111111111111111101000100101111100011110000110101100001110100011");
t(NumLit::i64(0xFFFEE71D5A504AEAu64 as i64), "0b1111111111111110111001110001110101011010010100000100101011101010");
t(NumLit::i64(0xFFFCB5580EF0E0BFu64 as i64), "0b1111111111111100101101010101100000001110111100001110000010111111");
t(NumLit::i64(0xFFF620082CD2A23Eu64 as i64), "0b1111111111110110001000000000100000101100110100101010001000111110");
t(NumLit::i64(0xFFE260188677E6BBu64 as i64), "0b1111111111100010011000000001100010000110011101111110011010111011");
t(NumLit::i64(0xFFA720499367B432u64 as i64), "0b1111111110100111001000000100100110010011011001111011010000110010");
t(NumLit::i64(0xFEF560DCBA371C97u64 as i64), "0b1111111011110101011000001101110010111010001101110001110010010111");
t(NumLit::i64(0xFCE022962EA555C6u64 as i64), "0b1111110011100000001000101001011000101110101001010101010111000110");
t(NumLit::i64(0xF6A067C28BF00153u64 as i64), "0b1111011010100000011001111100001010001011111100000000000101010011");
t(NumLit::i64(0xE3E13747A3D003FAu64 as i64), "0b1110001111100001001101110100011110100011110100000000001111111010");
t(NumLit::i64(0xABA3A5D6EB700BEFu64 as i64), "0b1010101110100011101001011101011011101011011100000000101111101111");
}
#[test]
#[rustfmt::skip]
pub fn test_f32s() {
setup_logger();
let t = test_float;
t(NumLit::f32(9.0), "9.0");
t(NumLit::f32(9.), "9.");
t(NumLit::f32(0.0), "0.0");
t(NumLit::f32(0.), "0.");
t(NumLit::f32(8.1), "8.1");
t(NumLit::f32(7.22), "7.22");
t(NumLit::f32(6.333), "6.333");
t(NumLit::f32(5.4444), "5.4444");
t(NumLit::f32(4.55555), "4.55555");
t(NumLit::f32(3.666666), "3.666666");
t(NumLit::f32(2.7777777), "2.7777777");
t(NumLit::f32(1.888_888_8), "1.88888888");
t(NumLit::f32(-1.888_888_8), "-1.88888888");
t(NumLit::f32(0.999999999), "0.999999999");
t(NumLit::f32(-0.999999999), "-0.999999999");
t(NumLit::f32(0.25), "0.25");
t(NumLit::f32(0.1), "0.1");
t(NumLit::f32(0.2), "0.2");
t(NumLit::f32(0.3), "0.3");
t(NumLit::f32(0.4), "0.4");
t(NumLit::f32(0.5), "0.5");
t(NumLit::f32(0.6), "0.6");
t(NumLit::f32(0.7), "0.7");
t(NumLit::f32(0.8), "0.8");
t(NumLit::f32(0.9), "0.9");
t(NumLit::f32(1.2), "1.2");
t(NumLit::f32(1.3), "1.3");
t(NumLit::f32(1.4), "1.4");
t(NumLit::f32(1.5), "1.5");
t(NumLit::f32(1.6), "1.6");
t(NumLit::f32(1.7), "1.7");
t(NumLit::f32(1.8), "1.8");
t(NumLit::f32(1.9), "1.9");
t(NumLit::f32(0.77), "0.77");
t(NumLit::f32(-0.888), "-0.888");
t(NumLit::f32(0.055), "0.055");
t(NumLit::f32(-0.003), "-0.003");
t(NumLit::f32(0.000256), "0.000256");
t(NumLit::f32(-0.2), "-0.2");
t(NumLit::f32(-0.3), "-0.3");
t(NumLit::f32(-0.7), "-0.7");
t(NumLit::f32(1.1), "1.1");
t(NumLit::f32(-1.2), "-1.2");
t(NumLit::f32(1.3), "1.3");
t(NumLit::f32(1.4), "1.4");
t(NumLit::f32(1.44), "1.44");
t(NumLit::f32(2.33), "2.33");
t(NumLit::f32(4.11), "4.11");
t(NumLit::f32(5.55), "5.55");
}
#[test]
#[rustfmt::skip]
pub fn test_exp() {
let t = test_float;
t(NumLit::f32(9e0), "9e0");
t(NumLit::f32(8e+0), "8e+0");
t(NumLit::f32(7e-0), "7e-0");
t(NumLit::f32(6E1), "6E1");
t(NumLit::f32(5E+1), "5E+1");
t(NumLit::f32(4E-1), "4E-1");
t(NumLit::f32(-9e10), "-9e10");
t(NumLit::f32(-8e+20), "-8e+20");
t(NumLit::f32(-7e-30), "-7e-30");
t(NumLit::f32(-4E-61), "-4E-61");
t(NumLit::f32(9e5), "9e5");
t(NumLit::f32(8e+3), "8e+3");
t(NumLit::f32(7e-2), "7e-2");
t(NumLit::f32(1.0e1), "1.0e1");
t(NumLit::f32(-3.0e22), "-3.0e22");
t(NumLit::f32(1.0e-1), "1.0e-1");
t(NumLit::f32(3.0e-22), "3.0e-22");
t(NumLit::f32(5.0e-333), "5.0e-333");
t(NumLit::f32(7.0e-4444), "7.0e-4444");
t(NumLit::f32(9.0e-55555), "9.0e-55555");
t(NumLit::f32(22.0e-666666), "22.0e-666666");
t(NumLit::f32(444.0e-7777777), "444.0e-7777777");
t(NumLit::f32(6666.0e-88888888), "6666.0e-88888888");
t(NumLit::f32(88888.0e-999999999), "88888.0e-999999999");
t(NumLit::f32(88_888.0e-999999999), "88_888.0e-999999999");
t(NumLit::f64(-6E41), "-6E41");
t(NumLit::f64(-5E+51), "-5E+51");
t(NumLit::f32(f32::INFINITY), "5.0e333");
t(NumLit::f32(f32::NEG_INFINITY), "-7.0e4444");
t(NumLit::f32(f32::INFINITY), "9.0e55555");
t(NumLit::f32(f32::NEG_INFINITY), "-22.0e666666");
t(NumLit::f32(f32::INFINITY), "444.0e7777777");
t(NumLit::f32(f32::NEG_INFINITY), "-6666.0e88888888");
t(NumLit::f32(f32::INFINITY), "88_888.0e999999999");
t(NumLit::f32(f32::INFINITY), "inf");
t(NumLit::f32(f32::INFINITY), "infinity");
t(NumLit::f32(f32::NEG_INFINITY), "-inf");
t(NumLit::f32(f32::NEG_INFINITY), "-infinity");
let f = fail_parse_float;
f("--1");
}
fn test_i32(exp: i32, dec: &str, hex: &str, bin: &str) {
parse_int(NumLit::i32(exp), dec);
parse_int(NumLit::i32(exp), hex);
parse_int(NumLit::i32(exp), bin);
}
fn test_u32(exp: u32, dec: &str, hex: &str, bin: &str) {
parse_int(NumLit::u32(exp), dec);
parse_int(NumLit::i32(exp as i32), hex);
parse_int(NumLit::i32(exp as i32), bin);
}
fn test_float(exp: NumLit, float: &str) {
parse_float(exp, float);
}
fn parse_int(exp: NumLit, token: &str) {
match call_parser(Rule::INT, token, &handle_int) {
Ok(Expr::Primitive {
val: Value::Number { val, .. },
..
}) => {
assert_eq!(exp, val);
}
unexp => handle_unexp_fail(unexp, token),
}
}
fn parse_float(exp: NumLit, token: &str) {
match call_parser(Rule::FLOAT, token, &handle_float) {
Ok(Expr::Primitive {
val: Value::Number { val, .. },
..
}) => {
assert_eq!(exp, val);
}
unexp => handle_unexp_fail(unexp, token),
}
}
fn fail_parse_float(token: &str) {
if let Ok(Expr::Primitive {
val: Value::Number { val, .. },
..
}) = fail_parser(Rule::FLOAT, token, &handle_float)
{
handle_unexp_pass(val, token);
}
}
fn handle_unexp_fail(res: Result<Expr, Vec<WhammError>>, token: &str) {
match res {
Ok(expr) => {
error!("Number did not parse correctly: {token} -> {:?}", expr);
panic!();
}
Err(errs) => {
error!("Parsing the number caused errors: {token}");
for e in errs.iter() {
error!("{:?}", e.ty)
}
panic!();
}
}
}
fn handle_unexp_pass(expr: NumLit, token: &str) {
error!(
"Number passed the parse, but it shouldn't have: {token} -> {:?}",
expr
);
panic!();
}
fn call_parser(
parse_rule: Rule,
token: &str,
handler: &dyn Fn(Pair<Rule>) -> Result<Expr, Vec<WhammError>>,
) -> Result<Expr, Vec<WhammError>> {
let parse_res = WhammParser::parse(parse_rule, token);
match parse_res {
Ok(mut pairs) => handler(pairs.next().unwrap()),
Err(e) => {
error!("Parsing the number caused errors: {token}\n{:?}", e);
panic!();
}
}
}
fn fail_parser(
parse_rule: Rule,
token: &str,
handler: &dyn Fn(Pair<Rule>) -> Result<Expr, Vec<WhammError>>,
) -> Result<Expr, Vec<WhammError>> {
let parse_res = WhammParser::parse(parse_rule, token);
match parse_res {
Ok(mut pairs) => handler(pairs.next().unwrap()),
Err(_) => Err(vec![]),
}
}