package TestCase::ComparisonOperator {
  use TestCase;
  
  sub string_comparison_operator : int () {
    my $string = "abc";
    my $string_same = "abc";
    my $string_short = "ab";
    my $string_long = "abcd";
    my $string_different_short= "ad";
    my $string_different_long= "adcd";
    my $string_empty = "";
    
    # eq
    my $eq_ok = 0;
    if ($string eq $string_same) {
      if (!($string eq $string_short)) {
        if (!($string eq $string_long)) {
          if (!($string eq $string_different_short)) {
            if (!($string eq $string_different_long)) {
              if (!($string eq $string_empty)) {
                $eq_ok = 1;
              }
            }
          }
        }
      }
    }

    # ne
    my $ne_ok = 0;
    if (!($string ne $string_same)) {
      if (($string ne $string_short)) {
        if (($string ne $string_long)) {
          if (($string ne $string_different_short)) {
            if (($string ne $string_different_long)) {
              if (($string ne $string_empty)) {
                $ne_ok = 1;
              }
            }
          }
        }
      }
    }

    # gt
    my $gt_ok = 0;
    if (!($string gt $string_same)) {
      if ($string gt $string_short) {
        if (!($string gt $string_long)) {
          if (!($string gt $string_different_short)) {
            if (!($string gt $string_different_long)) {
              if ($string gt $string_empty) {
                $gt_ok = 1;
              }
            }
          }
        }
      }
    }

    # ge
    my $ge_ok = 0;
    if ($string ge $string_same) {
      if ($string ge $string_short) {
        if (!($string ge $string_long)) {
          if (!($string ge $string_different_short)) {
            if (!($string ge $string_different_long)) {
              if ($string ge $string_empty) {
                $ge_ok = 1;
              }
            }
          }
        }
      }
    }

    # lt
    my $lt_ok = 0;
    if ($string lt $string_same) {
      if (!($string lt $string_short)) {
        if ($string lt $string_long) {
          if ($string lt $string_different_short) {
            if ($string lt $string_different_long) {
              if (!($string lt $string_empty)) {
                $lt_ok = 1;
              }
            }
          }
        }
      }
    }

    # le
    my $le_ok = 0;
    if ($string le $string_same) {
      if (!($string le $string_short)) {
        if ($string le $string_long) {
          if ($string le $string_different_short) {
            if ($string le $string_different_long) {
              if (!($string le $string_empty)) {
                $le_ok = 1;
              }
            }
          }
        }
      }
    }
    
    if ($eq_ok && $ne_ok && $gt_ok && $ge_ok && $lt_ok && $le_ok) {
      return 1;
    }
    
    return 0;
  }

  # If
  sub if_true_byte : int () {
    if ((int)(byte)1) {
      return 1;
    }
    
    return 0;
  }
  
  sub if_true_short : int () {
    if ((int)(short)1) {
      return 1;
    }
    
    return 0;
  }

  sub if_true_int : int () {
    if (1) {
      return 1;
    }
    
    return 0;
  }
  
  sub if_true_long : int () {
    if (1L) {
      return 1;
    }
    
    return 0;
  }
  
  sub if_true_float : int () {
    if (1.0f) {
      return 1;
    }
    
    return 0;
  }
  
  sub if_true_double : int () {
    if (1.0) {
      return 1;
    }
    
    return 0;
  }

  sub if_true_object : int () {
    if (new TestCase) {
      return 1;
    }
    
    return 0;
  }

  sub if_false_byte : int () {
    if ((int)(byte)0) {
      return 0;
    }
    
    return 1;
  }
  
  sub if_false_short : int () {
    if ((int)(short)0) {
      return 0;
    }
    
    return 1;
  }
  
  sub if_false_int : int () {
    if (0) {
      return 0;
    }
    
    return 1;
  }
  
  sub if_false_long : int () {
    if (0L) {
      return 0;
    }
    
    return 1;
  }
  
  sub if_false_float : int () {
    if (0.0f) {
      return 0;
    }
    
    return 1;
  }
  
  sub if_false_double : int () {
    if (0.0) {
      return 0;
    }
    
    return 1;
  }
  
  sub if_false_object : int () {
    if (undef) {
      return 0;
    }
    
    return 1;
  }
  
  sub if_else : int () {
    if (0) {
      return 0;
    }
    else {
      return 1;
    }
    
    return 0;
  }

  sub if_elsif : int () {
    if (0) {
      return 0;
    }
    elsif(1) {
      return 1;
    }
    else {
      return 0;
    }
    
    return 0;
  }

  sub if_elsif_2 : int () {
    if (0) {
      return 0;
    }
    elsif(0) {
      return 0;
    }
    elsif(1) {
      return 1;
    }
    else {
      return 0;
    }
    
    return 0;
  }
  
  sub if_duplicate : int () {
    
    if (1) {
      if (0) {
        return 0;
      }
      elsif (1) {
        return 1;
      }
      else {
        return 0;
      }
    }
    else {
      return 0;
    }
  }
  
  # eq 
  sub if_eq_undef  : int () {
    my $test_case : TestCase = undef;
    
    if (undef == undef) {
      if ($test_case == undef) {
        if (undef == $test_case) {
          return 1;
        }
      }
    }
    
    return 0;
  }

  sub if_eq_byte_same  : int () {
    
    if ((byte)3 == (byte)3) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_eq_byte_different  : int () {
    
    if ((byte)3 == (byte)2) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_eq_short_same  : int () {
    
    if ((short)3 == (short)3) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_eq_short_different  : int () {
    
    if ((short)3 == (short)2) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_eq_int_same  : int () {
    
    if (3 == 3) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_eq_int_different  : int () {
    
    if (3 == 2) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_eq_long_same  : int () {
    
    if ((long)3 == (long)3) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_eq_long_different  : int () {
    
    if ((long)3 == (long)2) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_eq_float_same  : int () {
    
    if (0.5f == 0.5f) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_eq_float_different  : int () {
    
    if (0.5f == 0.25f) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_eq_double_same  : int () {
    
    if (0.5 == 0.5) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_eq_double_different  : int () {
    
    if (0.5 == 0.25) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_eq_object_same  : int () {
    
    my $obj1 = new TestCase;
    
    if ($obj1 == $obj1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_eq_object_different  : int () {
    my $obj1 = new TestCase;
    my $obj2 = new TestCase;
    
    if ($obj1 == $obj2) {
      return 0;
    }
    else {
      return 1;
    }
  }

  # If a != b
  sub if_ne_undef  : int () {
    my $test_case : TestCase = new TestCase;
    
    if (undef != undef) {
    
    }
    else {
      if ($test_case != undef) {
        if (undef != $test_case) {
          return 1;
        }
      }
    }
    
    return 0;
  }
  sub if_ne_byte_same  : int () {
    
    if ((byte)3 != (byte)3) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_ne_byte_different  : int () {
    
    if ((byte)3 != (byte)2) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_ne_short_same  : int () {
    
    if ((int)(short)3 != (int)(short)3) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_ne_short_different  : int () {
    
    if ((int)(short)3 != (int)(short)2) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_ne_int_same  : int () {
    
    if ((int)3 != (int)3) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_ne_int_different  : int () {
    
    if ((int)3 != (int)2) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_ne_long_same  : int () {
    
    if ((long)3 != (long)3) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_ne_long_different  : int () {
    
    if ((long)3 != (long)2) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_ne_float_same  : int () {
    
    if (0.5f != 0.5f) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_ne_float_different  : int () {
    
    if (0.5f != 0.25f) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_ne_double_same  : int () {
    
    if (0.5 != 0.5) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_ne_double_different  : int () {
    
    if (0.5 != 0.25) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_ne_object_same  : int () {
    
    my $obj1 = new TestCase;
    
    if ($obj1 != $obj1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_ne_object_different  : int () {
    my $obj1 = new TestCase;
    my $obj2 = new TestCase;
    
    if ($obj1 != $obj2) {
      return 1;
    }
    else {
      return 0;
    }
  }

  # If a > b
  sub if_gt_byte_left_big  : int () {
    
    if ((byte)3 > (byte)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_gt_byte_same  : int () {
    
    if ((byte)3 > (byte)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_byte_right_big  : int () {
    
    if ((byte)3 > (byte)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_short_left_big  : int () {
    
    if ((int)(short)3 > (int)(short)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_gt_short_same  : int () {
    
    if ((int)(short)3 > (int)(short)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_short_right_big  : int () {
    
    if ((int)(short)3 > (int)(short)4) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_gt_int_left_big  : int () {
    
    if (3 > 1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_gt_int_same  : int () {
    
    if (3 > 3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_int_right_big  : int () {
    
    if (3 > 4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_long_left_big  : int () {
    
    if ((long)3 > (long)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_gt_long_same  : int () {
    
    if ((long)3 > (long)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_long_right_big  : int () {
    
    if ((long)3 > (long)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_float_left_big  : int () {
    
    if ((float)3 > (float)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_gt_float_same  : int () {
    
    if ((float)3 > (float)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_float_right_big  : int () {
    
    if ((float)3 > (float)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_double_left_big  : int () {
    
    if ((double)3 > (double)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_gt_double_same  : int () {
    
    if ((double)3 > (double)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_gt_double_right_big  : int () {
    
    if ((double)3 > (double)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  # If a >= b
  sub if_ge_byte_left_big  : int () {
    
    if ((byte)3 >= (byte)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_byte_same  : int () {
    
    if ((byte)3 >= (byte)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_byte_right_big  : int () {
    
    if ((byte)3 >= (byte)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_ge_short_left_big  : int () {
    
    if ((int)(short)3 >= (int)(short)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_short_same  : int () {
    
    if ((int)(short)3 >= (int)(short)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_short_right_big  : int () {
    
    if ((int)(short)3 >= (int)(short)4) {
      return 0;
    }
    else {
      return 1;
    }
  }
  
  sub if_ge_int_left_big  : int () {
    
    if (3 >= 1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_int_same  : int () {
    
    if (3 >= 3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_int_right_big  : int () {
    
    if (3 >= 4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_ge_long_left_big  : int () {
    
    if ((long)3 >= (long)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_long_same  : int () {
    
    if ((long)3 >= (long)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_long_right_big  : int () {
    
    if ((long)3 >= (long)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_ge_float_left_big  : int () {
    
    if ((float)3 >= (float)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_float_same  : int () {
    
    if ((float)3 >= (float)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_float_right_big  : int () {
    
    if ((float)3 >= (float)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_ge_double_left_big  : int () {
    
    if ((double)3 >= (double)1) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_double_same  : int () {
    
    if ((double)3 >= (double)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_ge_double_right_big  : int () {
    
    if ((double)3 >= (double)4) {
      return 0;
    }
    else {
      return 1;
    }
  }

  # If a < b
  sub if_lt_byte_left_big  : int () {
    
    if ((byte)3 < (byte)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_byte_same  : int () {
    
    if ((byte)3 < (byte)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_byte_right_big  : int () {
    
    if ((byte)3 < (byte)4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_lt_short_left_big  : int () {
    
    if ((int)(short)3 < (int)(short)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_short_same  : int () {
    
    if ((int)(short)3 < (int)(short)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_short_right_big  : int () {
    
    if ((int)(short)3 < (int)(short)4) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_lt_int_left_big  : int () {
    
    if (3 < 1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_int_same  : int () {
    
    if (3 < 3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_int_right_big  : int () {
    
    if (3 < 4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_lt_long_left_big  : int () {
    
    if ((long)3 < (long)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_long_same  : int () {
    
    if ((long)3 < (long)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_long_right_big  : int () {
    
    if ((long)3 < (long)4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_lt_float_left_big  : int () {
    
    if ((float)3 < (float)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_float_same  : int () {
    
    if ((float)3 < (float)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_float_right_big  : int () {
    
    if ((float)3 < (float)4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_lt_double_left_big  : int () {
    
    if ((double)3 < (double)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_double_same  : int () {
    
    if ((double)3 < (double)3) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_lt_double_right_big  : int () {
    
    if ((double)3 < (double)4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  # If a <= b
  sub if_le_byte_left_big  : int () {
    
    if ((byte)3 <= (byte)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_le_byte_same  : int () {
    
    if ((byte)3 <= (byte)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_byte_right_big  : int () {
    
    if ((byte)3 <= (byte)4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_short_left_big  : int () {
    
    if ((int)(short)3 <= (int)(short)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_le_short_same  : int () {
    
    if ((int)(short)3 <= (int)(short)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_short_right_big  : int () {
    
    if ((int)(short)3 <= (int)(short)4) {
      return 1;
    }
    else {
      return 0;
    }
  }
  
  sub if_le_int_left_big  : int () {
    
    if (3 <= 1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_le_int_same  : int () {
    
    if (3 <= 3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_int_right_big  : int () {
    
    if (3 <= 4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_long_left_big  : int () {
    
    if ((long)3 <= (long)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_le_long_same  : int () {
    
    if ((long)3 <= (long)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_long_right_big  : int () {
    
    if ((long)3 <= (long)4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_float_left_big  : int () {
    
    if ((float)3 <= (float)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_le_float_same  : int () {
    
    if ((float)3 <= (float)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_float_right_big  : int () {
    
    if ((float)3 <= (float)4) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_double_left_big  : int () {
    
    if ((double)3 <= (double)1) {
      return 0;
    }
    else {
      return 1;
    }
  }

  sub if_le_double_same  : int () {
    
    if ((double)3 <= (double)3) {
      return 1;
    }
    else {
      return 0;
    }
  }

  sub if_le_double_right_big  : int () {
    
    if ((double)3 <= (double)4) {
      return 1;
    }
    else {
      return 0;
    }
  }
}