package TestCase::Literal::Integer {
  use SPVM::Util (INT8_MIN, INT8_MAX, INT16_MIN, INT16_MAX, INT32_MIN, INT32_MAX, INT64_MIN, INT64_MAX, FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX);
  
  # decimal literal
  sub decimal_all_numbers : int () {
    my $all_numbers = 1234567890;
    unless ($all_numbers == 1234567889 + 1) {
      return 0;
    }
    return 1;
  }
  sub decimal_plus_max : int () {
    my $plus_max = +2147483647;
    unless ($plus_max == 2147483647) {
      return 0;
    }
    return 1;
  }
  sub decimal_minus_max : int () {
    my $minus_max = -2147483648;
    unless ($minus_max == -2147483647 - 1) {
      return 0;
    }
    return 1;
  }
  sub decimal_underline : int () {
    my $underline = 123_456__789;
    unless ($underline == 123456789) {
      return 0;
    }
    return 1;
  }
  sub decimal_long_minus_max : int () {
    my $long_minus_max = -9223372036854775808L;
    unless ($long_minus_max == -9223372036854775807L - 1L) {
      return 0;
    }
    return 1;
  }
  sub decimal_long_lower_case : int () {
    my $long_lower_case = 4l;
    unless ($long_lower_case == 4L) {
      return 0;
    }
    return 1;
  }
  sub decimal_long_underline : int () {
    my $long_underline = 123_456L;
    unless ($long_underline == 123456L) {
      return 0;
    }
    return 1;
  }
  sub decimal_byte_norrowing_convertion : int () {
    my $byte_norrowing_convertion : byte = -128;
    unless ($byte_norrowing_convertion == -128) {
      return 0;
    }
    return 1;
  }
  sub decimal_short_norrowing_convertion : int () {
    my $short_norrowing_convertion : short = -32768;
    unless ($short_norrowing_convertion == -32768) {
      return 0;
    }
    return 1;
  }
  
  # hex
  sub hex_all_numbers : int () {
    my $all_numbers1 = 0x01234567;
    my $all_numbers2 = 0x00890000;
    my $all_numbers3 = 0x00ABCDEF;
    my $all_numbers4 = 0x00abcdef;
    unless ($all_numbers1 == 19088743) {
      return 0;
    }
    unless ($all_numbers2 == 8978432) {
      return 0;
    }
    unless ($all_numbers3 == 11259375) {
      return 0;
    }
    unless ($all_numbers4 == 11259375) {
      return 0;
    }
    return 1;
  }
  sub hex_all_f : int () {
    my $all_f = 0xFFFFFFFF;
    unless ($all_f == -1) {
      return 0;
    }
    return 1;
  }
  sub hex_max_int : int () {
    my $max_int = 0x7FFFFFFF;
    unless ($max_int == INT32_MAX()) {
      return 0;
    }
    return 1;
  }
  sub hex_min_int : int () {
    my $min_int = 0x80000000;
    unless ($min_int == INT32_MIN()) {
      return 0;
    }
    return 1;
  }
  sub hex_combination : int () {
    my $combination = -0x000000FF_FFFFFFFFL;
    unless ($combination == -1099511627775L) {
      return 0;
    }
    return 1;
  }
  sub hex_long_all_f : int () {
    my $long_all_f = 0xFFFFFFFF_FFFFFFFFL;
    unless ($long_all_f == -1L) {
      return 0;
    }
    return 1;
  }
  
  # octal
  sub octal_all_numbers : int () {
    my $all_numbers = 012345670;
    unless ($all_numbers == 2739128) {
      return 0;
    }
    return 1;
  }
  sub octal_combination : int () {
    my $combination = -0777_777777777777777777L;
    unless ($combination == -9223372036854775807L) {
      return 0;
    }
    return 1;
  }
  
  # binary
  sub binary_all_numbers : int () {
    my $all_numbers = 0b10101010;
    unless ($all_numbers == 170) {
      return 0;
    }
    return 1;
  }
  sub binary_combination : int () {
    my $combination = -0b11111111_1111111111111111111111111111111111111111111111111111111L;
    unless ($combination == -9223372036854775807L) {
      return 0;
    }
    
    return 1;
  }
}