class TestCase::LogicalOperator {
  use TestCase::Minimal;

  static method logical_and_nagate : int () {
    if (!(1 && 1)) {
      return 0;
    }
    
    return 1;
  }
  
  static method logical_and_push_mortal_leave_scope : int () {
    my $minimals = new TestCase::Minimal[4];
    $minimals->[0] = TestCase::Minimal->new;
    $minimals->[0]{x} = 1;
    $minimals->[1] = TestCase::Minimal->new;
    $minimals->[1]{x} = 2;
    $minimals->[2] = TestCase::Minimal->new;
    $minimals->[2]{x} = 3;
    $minimals->[3] = TestCase::Minimal->new;
    $minimals->[3]{x} = 4;
    
    
    if ($minimals->[0]{x} == 1 && $minimals->[1]{x} == 2 && $minimals->[2]{x} == 3 && $minimals->[3]{x} == 4) {
      return 1;
    }
    
    return 0;
  }
  
  static method logical_not_false : int () {
    if (!0) {
      return 1;
    }
    
    return 0;
  }

  # logical or
  static method logical_or_both_true : int () {
    unless (1 || 1) {
      return 0;
    }
    
    if (1 || 1) {
      # OK
    }
    else {
      return 0;
    }
    
    if (1 || 0) {
      # OK
    }
    else {
      return 0;
    }
    
    if (0 || 1) {
      # OK
    }
    else {
      return 0;
    }
    
    if (0 || 0) {
      return 0;
    }
    else {
      # OK
    }

    return 1;
  }
  
  static method logical_or_left_true : int () {
    if (1 || 0) {
      return 1;
    }
    
    return 0;
  }

  static method logical_or_right_true : int () {
    if (0 || 1) {
      return 1;
    }
    
    return 0;
  }

  static method logical_or_both_false : int () {
    if (0 || 0) {
      return 0;
    }
    
    return 1;
  }
  
  # logical and
  static method logical_and_both_true : int () {
    unless (1 && 1) {
      return 0;
    }
    
    if (1 && 1) {
      # OK
    }
    else {
      return 0;
    }

    if (1 && 0) {
      return 0;
    }
    else {
      # OK
    }
    
    if (0 && 1) {
      return 0;
    }
    else {
      # OK
    }
    
    if (0 && 0) {
      return 0;
    }
    else {
      # OK
    }

    return 1;
  }
  
  static method logical_and_left_true : int () {
    if (1 && 0) {
      return 0;
    }
    
    return 1;
  }

  static method logical_and_right_true : int () {
    if (1 && 0) {
      return 0;
    }
    
    return 1;
  }

  static method logical_and_both_false : int () {
    if (0 && 0) {
      return 0;
    }
    
    return 1;
  }
}