package openmods.calc;
import openmods.calc.CalcTestUtils.ValueParserHelper;
import openmods.calc.types.fraction.FractionParser;
import org.apache.commons.lang3.math.Fraction;
import org.junit.Test;
public class FractionParserTest {
public final FractionParser parser = new FractionParser();
private final ValueParserHelper<Fraction> helper = new ValueParserHelper<Fraction>(parser);
private static Fraction f(int value) {
return Fraction.getFraction(value, 1);
}
private static Fraction f(int n, int d) {
return Fraction.getReducedFraction(n, d);
}
@Test
public void testBinary() {
helper.testBin(Fraction.ZERO, "0");
helper.testBin(Fraction.ZERO, "00");
helper.testBin(Fraction.ZERO, "0_0");
helper.testBin(Fraction.ZERO, "0__0");
helper.testBin(Fraction.ONE, "1");
helper.testBin(Fraction.ONE, "01");
helper.testBin(Fraction.ONE, "0_1");
helper.testBin(Fraction.ONE, "0__1");
helper.testBin(f(2), "10");
helper.testBin(f(3), "11");
helper.testBin(f(4), "100");
helper.testBin(f(7), "111");
helper.testBin(f(1, 2), "0.1");
helper.testBin(f(3, 4), "0.11");
helper.testBin(f(1, 4), "0.01");
helper.testBin(f(7, 8), "0.111");
helper.testBin(f(1, 8), "0.001");
helper.testBin(f(1, 8), "0.0_01");
helper.testBin(f(1, 8), "0.0_0_1");
}
@Test
public void testOctal() {
helper.testOct(Fraction.ZERO, "0");
helper.testOct(Fraction.ZERO, "00");
helper.testOct(Fraction.ZERO, "0_0");
helper.testOct(Fraction.ZERO, "0__0");
helper.testOct(Fraction.ONE, "1");
helper.testOct(Fraction.ONE, "01");
helper.testOct(Fraction.ONE, "0_1");
helper.testOct(Fraction.ONE, "0__1");
helper.testOct(f(2), "2");
helper.testOct(f(7), "7");
helper.testOct(f(8), "10");
helper.testOct(f(15), "17");
helper.testOct(f(16), "20");
helper.testOct(f(34), "42");
helper.testOct(f(83), "123");
helper.testOct(f(1, 8), "0.1");
helper.testOct(f(7, 8), "0.7");
helper.testOct(f(1, 64), "0.01");
helper.testOct(f(63, 64), "0.77");
helper.testOct(f(63, 64), "0.7_7");
}
@Test
public void testDecimal() {
helper.testDec(Fraction.ZERO, "0");
helper.testDec(Fraction.ZERO, "00");
helper.testDec(Fraction.ZERO, "0_0");
helper.testDec(Fraction.ZERO, "0__0");
helper.testDec(Fraction.ONE, "1");
helper.testDec(Fraction.ONE, "01");
helper.testDec(Fraction.ONE, "0_1");
helper.testDec(Fraction.ONE, "0__1");
helper.testDec(f(2), "2");
helper.testDec(f(9), "9");
helper.testDec(f(10), "10");
helper.testDec(f(19), "19");
helper.testDec(f(20), "20");
helper.testDec(f(42), "42");
helper.testDec(f(123), "123");
helper.testDec(f(1, 10), "0.1");
helper.testDec(f(9, 10), "0.9");
helper.testDec(f(1, 100), "0.01");
helper.testDec(f(99, 100), "0.99");
helper.testDec(f(99, 100), "0.9_9");
}
@Test
public void testHexadecimal() {
helper.testHex(Fraction.ZERO, "0");
helper.testHex(Fraction.ZERO, "00");
helper.testHex(Fraction.ZERO, "0_0");
helper.testHex(Fraction.ZERO, "0__0");
helper.testHex(Fraction.ONE, "1");
helper.testHex(Fraction.ONE, "01");
helper.testHex(Fraction.ONE, "0_1");
helper.testHex(Fraction.ONE, "0__1");
helper.testHex(f(2), "2");
helper.testHex(f(10), "A");
helper.testHex(f(15), "F");
helper.testHex(f(16), "10");
helper.testHex(f(31), "1F");
helper.testHex(f(32), "20");
helper.testHex(f(66), "42");
helper.testHex(f(419), "1A3");
helper.testHex(f(1, 16), "0.1");
helper.testHex(f(15, 16), "0.F");
helper.testHex(f(1, 256), "0.01");
helper.testHex(f(255, 256), "0.FF");
helper.testHex(f(255, 256), "0.F_F");
}
@Test
public void testQuotedDecimalZeros() {
helper.testQuoted(Fraction.ZERO, "2#0");
helper.testQuoted(Fraction.ZERO, "2#00");
helper.testQuoted(Fraction.ZERO, "3#0");
helper.testQuoted(Fraction.ZERO, "8#0");
}
@Test
public void testQuotedIntegerOnes() {
helper.testQuoted(Fraction.ONE, "2#1");
helper.testQuoted(Fraction.ONE, "2#01");
helper.testQuoted(Fraction.ONE, "3#1");
helper.testQuoted(Fraction.ONE, "8#1");
}
@Test
public void testQuotedIntegerTens() {
helper.testQuoted(f(2), "2#10");
helper.testQuoted(f(3), "3#10");
helper.testQuoted(f(4), "4#10");
helper.testQuoted(f(5), "5#10");
helper.testQuoted(f(10), "10#10");
helper.testQuoted(f(16), "16#10");
}
@Test
public void testQuotedFractionBases() {
helper.testQuoted(f(1, 2), "2#0.1");
helper.testQuoted(f(1, 3), "3#0.1");
helper.testQuoted(f(1, 4), "4#0.1");
helper.testQuoted(f(1, 5), "5#0.1");
helper.testQuoted(f(1, 10), "10#0.1");
helper.testQuoted(f(1, 16), "16#0.1");
}
@Test
public void testQuotedIntegerA() {
helper.testQuoted(f(10), "11#A");
helper.testQuoted(f(10), "12#A");
helper.testQuoted(f(10), "13#A");
helper.testQuoted(f(10), "14#A");
helper.testQuoted(f(10), "15#A");
helper.testQuoted(f(10), "16#A");
}
@Test
public void testQuotedIntegerSingleLargeDigit() {
helper.testQuoted(f(10), "11#'10'");
helper.testQuoted(f(10), "12#'10'");
helper.testQuoted(f(10), "13#'10'");
helper.testQuoted(f(10), "14#'10'");
helper.testQuoted(f(10), "15#'10'");
helper.testQuoted(f(10), "16#'10'");
}
@Test
public void testQuotedFractionSingleLargeDigit() {
helper.testQuoted(f(10, 11), "11#0.'10'");
helper.testQuoted(f(10, 12), "12#0.'10'");
helper.testQuoted(f(10, 13), "13#0.'10'");
helper.testQuoted(f(10, 14), "14#0.'10'");
helper.testQuoted(f(10, 15), "15#0.'10'");
helper.testQuoted(f(10, 16), "16#0.'10'");
}
@Test
public void testQuotedFractionSeparators() {
helper.testQuoted(Fraction.ZERO, "2#0_0");
helper.testQuoted(Fraction.ZERO, "2#0__0");
helper.testQuoted(Fraction.ONE, "2#0_1");
helper.testQuoted(Fraction.ONE, "2#0__1");
helper.testQuoted(f(123, 100), "10#1.2_3");
helper.testQuoted(f(14 * 16 + 5, 256), "16#0.'14'_5");
}
@Test
public void testQuotedIntegerMultipleLargeDigitsSingleQuotes() {
helper.testQuoted(f(9 * 11 + 10), "11#'9''10'");
helper.testQuoted(f((9 * 12 + 10) * 12 + 11), "12#'9''10''11'");
helper.testQuoted(f(((9 * 13 + 10) * 13 + 11) * 13 + 12), "13#'9''10''11''12'");
helper.testQuoted(f(9 * 13 + 10 * 1).add(f(11, 13)).add(f(12, (13 * 13))), "13#'9''10'.'11''12'");
}
@Test
public void testQuotedIntegerMultipleLargeDigitsDoubleQuotes() {
helper.testQuoted(f(9 * 11 + 10), "11#'9\"10'");
helper.testQuoted(f((9 * 12 + 10) * 12 + 11), "12#'9\"10\"11'");
helper.testQuoted(f(((9 * 13 + 10) * 13 + 11) * 13 + 12), "13#'9\"10\"11\"12'");
}
@Test
public void testQuotedIntegerMixedDigits() {
helper.testQuoted(f(666), "16#29'10'");
helper.testQuoted(f((11 * 16 + 5) * 16 + 10), "16#'11'5'10'");
helper.testQuoted(f(16 * 16 * 16), "16#'1'0'0'0");
helper.testQuoted(f((10 * 16 + 11) * 16 + 12), "16#'10\"11'C");
}
}