// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package backport;

import java.math.BigInteger;

public final class IntegerBackportJava9Main {
  private static final int[] interestingValues = {
    Integer.MIN_VALUE,
    Integer.MAX_VALUE,
    Short.MIN_VALUE,
    Short.MAX_VALUE,
    Byte.MIN_VALUE,
    Byte.MAX_VALUE,
    0,
    -1,
    1,
    -42,
    42
  };

  public static void main(String[] args) {
    testParseIntegerSubsequenceWithRadix();
  }

  private static void testParseIntegerSubsequenceWithRadix() {
    for (int value : interestingValues) {
      for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
        for (String prefix : new String[] {"", "x", "xxx"}) {
          for (String postfix : new String[] {"", "x", "xxx"}) {
            String valueString = prefix + Long.toString(value, radix) + postfix;
            int start = prefix.length();
            int end = valueString.length() - postfix.length();
            assertEquals(valueString, value, Integer.parseInt(valueString, start, end, radix));
            if (value > 0) {
              valueString = prefix + '+' + Long.toString(value, radix) + postfix;
              end++;
              assertEquals(valueString, value, Integer.parseInt(valueString, start, end, radix));
            }
          }
        }
      }
    }

    try {
      throw new AssertionError(Integer.parseInt("0", 0, 1, Character.MIN_RADIX - 1));
    } catch (IllegalArgumentException expected) {
    }
    try {
      throw new AssertionError(Integer.parseInt("0", 0, 1, Character.MAX_RADIX + 1));
    } catch (IllegalArgumentException expected) {
    }

    try {
      throw new AssertionError(Integer.parseInt("", 0, 0, 16));
    } catch (NumberFormatException expected) {
    }
    try {
      throw new AssertionError(Integer.parseInt("-", 0, 1, 16));
    } catch (NumberFormatException expected) {
    }
    try {
      throw new AssertionError(Integer.parseInt("+", 0, 1, 16));
    } catch (NumberFormatException expected) {
    }

    try {
      throw new AssertionError(Integer.parseInt("+a", 0, 2, 10));
    } catch (NumberFormatException expected) {
    }

    BigInteger overflow = new BigInteger("18446744073709551616");
    for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
      for (String prefix : new String[] {"", "x", "xxx"}) {
        for (String postfix : new String[] {"", "x", "xxx"}) {
          String overflowString = prefix + overflow.toString(radix) + postfix;
          int start = prefix.length();
          int end = overflowString.length() - postfix.length();
          try {
            throw new AssertionError(Long.parseLong(overflowString, start, end, radix));
          } catch (NumberFormatException expected) {
          }
          String underflowString = prefix + '-' + overflow.toString(radix) + postfix;
          start = prefix.length();
          end = underflowString.length() - postfix.length();
          try {
            throw new AssertionError(Long.parseLong(underflowString, start, end, radix));
          } catch (NumberFormatException expected) {
          }
        }
      }
    }
  }

  private static void assertEquals(String m, int expected, int actual) {
    if (expected != actual) {
      throw new AssertionError(m + " Expected <" + expected + "> but was <" + actual + '>');
    }
  }
}
