package tests;
import code.ast.NumberUtil;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class NumberUtilTest {
@Test
public void testIsHexNumber() {
// --- Valid format numbers ---
assertTrue("Standard hex", NumberUtil.isHexNumber("0x123456789ABCDEF"));
assertTrue("Mixed case prefix", NumberUtil.isHexNumber("0Xabcdef"));
assertTrue("Hex with underscores", NumberUtil.isHexNumber("0x123_456"));
assertTrue("Hex with long suffix (L)", NumberUtil.isHexNumber("0x123L"));
assertTrue("Hex with long suffix (l)", NumberUtil.isHexNumber("0x123l"));
assertTrue("Minimum valid hex", NumberUtil.isHexNumber("0x0"));
assertTrue("Successive underscores", NumberUtil.isHexNumber("0x123__456"));
// --- Invalid format numbers ---
// Null and empty
assertFalse("Null string", NumberUtil.isHexNumber(null));
assertFalse("Empty string", NumberUtil.isHexNumber(""));
assertFalse("Prefix only", NumberUtil.isHexNumber("0x"));
// Incorrect prefix
assertFalse("Missing prefix", NumberUtil.isHexNumber("123"));
assertFalse("Invalid prefix (0y)", NumberUtil.isHexNumber("0y123"));
assertFalse("Leading space", NumberUtil.isHexNumber(" 0x123"));
// Invalid characters
assertFalse("Invalid character (g)", NumberUtil.isHexNumber("0x12g"));
assertFalse("Decimal point", NumberUtil.isHexNumber("0x1.2"));
// Underscore placement rules
assertFalse("Underscore immediately after prefix", NumberUtil.isHexNumber("0x_123"));
assertFalse("Trailing underscore", NumberUtil.isHexNumber("0x123_"));
assertFalse("Trailing underscore with L", NumberUtil.isHexNumber("0x123_L"));
// Long suffix rules
assertFalse("L in middle", NumberUtil.isHexNumber("0x1L2"));
assertFalse("Multiple L", NumberUtil.isHexNumber("0x1LL"));
assertFalse("L with invalid char", NumberUtil.isHexNumber("0x1GL"));
// No digits
assertFalse("No hex digits (0xL)", NumberUtil.isHexNumber("0xL"));
}
@Test
public void testIsBinaryNumber() {
// --- Valid format numbers ---
assertTrue("Standard binary", NumberUtil.isBinaryNumber("0b10101010"));
assertTrue("Mixed case prefix", NumberUtil.isBinaryNumber("0B1100"));
assertTrue("Binary with underscores", NumberUtil.isBinaryNumber("0b1_0_1"));
assertTrue("Binary with long suffix (L)", NumberUtil.isBinaryNumber("0b101L"));
assertTrue("Binary with long suffix (l)", NumberUtil.isBinaryNumber("0b110l"));
assertTrue("Minimum valid binary", NumberUtil.isBinaryNumber("0b0"));
assertTrue("Successive underscores", NumberUtil.isBinaryNumber("0b101__010"));
// --- Invalid format numbers ---
// Null and empty
assertFalse("Null string", NumberUtil.isBinaryNumber(null));
assertFalse("Empty string", NumberUtil.isBinaryNumber(""));
assertFalse("Prefix only", NumberUtil.isBinaryNumber("0b"));
// Incorrect prefix
assertFalse("Missing prefix", NumberUtil.isBinaryNumber("101"));
assertFalse("Invalid prefix (0x)", NumberUtil.isBinaryNumber("0x101"));
assertFalse("Leading space", NumberUtil.isBinaryNumber(" 0b101"));
// Invalid characters
assertFalse("Invalid character (2)", NumberUtil.isBinaryNumber("0b102"));
assertFalse("Invalid character (a)", NumberUtil.isBinaryNumber("0b10a"));
assertFalse("Decimal point", NumberUtil.isBinaryNumber("0b1.0"));
// Underscore placement rules
assertFalse("Underscore immediately after prefix", NumberUtil.isBinaryNumber("0b_101"));
assertFalse("Trailing underscore", NumberUtil.isBinaryNumber("0b101_"));
assertFalse("Trailing underscore with L", NumberUtil.isBinaryNumber("0b101_L"));
// Long suffix rules
assertFalse("L in middle", NumberUtil.isBinaryNumber("0b1L0"));
assertFalse("Multiple L", NumberUtil.isBinaryNumber("0b1LL"));
assertFalse("L with invalid char", NumberUtil.isBinaryNumber("0b12L"));
// No digits
assertFalse("No binary digits (0bL)", NumberUtil.isBinaryNumber("0bL"));
}
}