package TestCase::ValueArray {
  use TestCase::Point_3b;
  use TestCase::Point_3s;
  use TestCase::Point_3i;
  use TestCase::Point_3l;
  use TestCase::Point_3f;
  use TestCase::Point_3d;
  
  use TestCase::Matrix4_16b;
  use TestCase::Matrix4_16s;
  use TestCase::Matrix4_16i;
  use TestCase::Matrix4_16l;
  use TestCase::Matrix4_16f;
  use TestCase::Matrix4_16d;
  
  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);
  
  sub value_array_max_fields_byte : int () {
    my $mat = new TestCase::Matrix4_16b[3];
    
    $mat->[0]{x11} = INT8_MIN();
    $mat->[0]{x21} = 21;
    $mat->[0]{x31} = 31;
    $mat->[0]{x41} = 41;
    
    $mat->[0]{x12} = 12;
    $mat->[0]{x22} = 22;
    $mat->[0]{x32} = 32;
    $mat->[0]{x42} = 42;
    
    $mat->[0]{x13} = 13;
    $mat->[0]{x23} = 23;
    $mat->[0]{x33} = 33;
    $mat->[0]{x43} = 43;
    
    $mat->[0]{x14} = 14;
    $mat->[0]{x24} = 24;
    $mat->[0]{x34} = 34;
    $mat->[0]{x44} = 44;

    $mat->[1]{x11} = 21;
    $mat->[1]{x21} = 31;
    $mat->[1]{x31} = 41;
    $mat->[1]{x41} = 51;
    
    $mat->[1]{x12} = 22;
    $mat->[1]{x22} = 32;
    $mat->[1]{x32} = 42;
    $mat->[1]{x42} = 52;
    
    $mat->[1]{x13} = 23;
    $mat->[1]{x23} = 33;
    $mat->[1]{x33} = 43;
    $mat->[1]{x43} = 53;
    
    $mat->[1]{x14} = 24;
    $mat->[1]{x24} = 34;
    $mat->[1]{x34} = 44;
    $mat->[1]{x44} = 54;
    
    $mat->[2]{x11} = (byte)($mat->[0]{x11} + $mat->[1]{x11});
    $mat->[2]{x21} = (byte)($mat->[0]{x21} + $mat->[1]{x21});
    $mat->[2]{x31} = (byte)($mat->[0]{x31} + $mat->[1]{x31});
    $mat->[2]{x41} = (byte)($mat->[0]{x41} + $mat->[1]{x41});
    
    $mat->[2]{x12} = (byte)($mat->[0]{x12} + $mat->[1]{x12});
    $mat->[2]{x22} = (byte)($mat->[0]{x22} + $mat->[1]{x22});
    $mat->[2]{x32} = (byte)($mat->[0]{x32} + $mat->[1]{x32});
    $mat->[2]{x42} = (byte)($mat->[0]{x42} + $mat->[1]{x42});
    
    $mat->[2]{x13} = (byte)($mat->[0]{x13} + $mat->[1]{x13});
    $mat->[2]{x23} = (byte)($mat->[0]{x23} + $mat->[1]{x23});
    $mat->[2]{x33} = (byte)($mat->[0]{x33} + $mat->[1]{x33});
    $mat->[2]{x43} = (byte)($mat->[0]{x43} + $mat->[1]{x43});
    
    $mat->[2]{x14} = (byte)($mat->[0]{x14} + $mat->[1]{x14});
    $mat->[2]{x24} = (byte)($mat->[0]{x24} + $mat->[1]{x24});
    $mat->[2]{x34} = (byte)($mat->[0]{x34} + $mat->[1]{x34});
    $mat->[2]{x44} = (byte)($mat->[0]{x44} + $mat->[1]{x44});

    unless ($mat->[2]{x11} == INT8_MIN() + 21) {
      return 0;
    }
    unless ($mat->[2]{x21} == 52) {
      return 0;
    }
    unless ($mat->[2]{x31} == 72) {
      return 0;
    }
    unless ($mat->[2]{x41} == 92) {
      return 0;
    }
    unless ($mat->[2]{x12} == 34) {
      return 0;
    }
    unless ($mat->[2]{x22} == 54) {
      return 0;
    }
    unless ($mat->[2]{x32} == 74) {
      return 0;
    }
    unless ($mat->[2]{x42} == 94) {
      return 0;
    }
    unless ($mat->[2]{x13} == 36) {
      return 0;
    }
    unless ($mat->[2]{x23} == 56) {
      return 0;
    }
    unless ($mat->[2]{x33} == 76) {
      return 0;
    }
    unless ($mat->[2]{x43} == 96) {
      return 0;
    }
    unless ($mat->[2]{x41} == 92) {
      return 0;
    }
    unless ($mat->[2]{x42} == 94) {
      return 0;
    }
    unless ($mat->[2]{x43} == 96) {
      return 0;
    }
    unless ($mat->[2]{x44} == 98) {
      return 0;
    }
    
    return 1;
  }

  sub value_array_max_fields_short : int () {
    my $mat = new TestCase::Matrix4_16s[3];
    
    $mat->[0]{x11} = INT16_MIN();
    $mat->[0]{x21} = 21;
    $mat->[0]{x31} = 31;
    $mat->[0]{x41} = 41;
    
    $mat->[0]{x12} = 12;
    $mat->[0]{x22} = 22;
    $mat->[0]{x32} = 32;
    $mat->[0]{x42} = 42;
    
    $mat->[0]{x13} = 13;
    $mat->[0]{x23} = 23;
    $mat->[0]{x33} = 33;
    $mat->[0]{x43} = 43;
    
    $mat->[0]{x14} = 14;
    $mat->[0]{x24} = 24;
    $mat->[0]{x34} = 34;
    $mat->[0]{x44} = 44;

    $mat->[1]{x11} = 111;
    $mat->[1]{x21} = 121;
    $mat->[1]{x31} = 131;
    $mat->[1]{x41} = 141;
    
    $mat->[1]{x12} = 112;
    $mat->[1]{x22} = 122;
    $mat->[1]{x32} = 132;
    $mat->[1]{x42} = 142;
    
    $mat->[1]{x13} = 113;
    $mat->[1]{x23} = 123;
    $mat->[1]{x33} = 133;
    $mat->[1]{x43} = 143;
    
    $mat->[1]{x14} = 114;
    $mat->[1]{x24} = 124;
    $mat->[1]{x34} = 134;
    $mat->[1]{x44} = 144;
    
    $mat->[2]{x11} = (short)($mat->[0]{x11} + $mat->[1]{x11});
    $mat->[2]{x21} = (short)($mat->[0]{x21} + $mat->[1]{x21});
    $mat->[2]{x31} = (short)($mat->[0]{x31} + $mat->[1]{x31});
    $mat->[2]{x41} = (short)($mat->[0]{x41} + $mat->[1]{x41});
    
    $mat->[2]{x12} = (short)($mat->[0]{x12} + $mat->[1]{x12});
    $mat->[2]{x22} = (short)($mat->[0]{x22} + $mat->[1]{x22});
    $mat->[2]{x32} = (short)($mat->[0]{x32} + $mat->[1]{x32});
    $mat->[2]{x42} = (short)($mat->[0]{x42} + $mat->[1]{x42});
    
    $mat->[2]{x13} = (short)($mat->[0]{x13} + $mat->[1]{x13});
    $mat->[2]{x23} = (short)($mat->[0]{x23} + $mat->[1]{x23});
    $mat->[2]{x33} = (short)($mat->[0]{x33} + $mat->[1]{x33});
    $mat->[2]{x43} = (short)($mat->[0]{x43} + $mat->[1]{x43});
    
    $mat->[2]{x14} = (short)($mat->[0]{x14} + $mat->[1]{x14});
    $mat->[2]{x24} = (short)($mat->[0]{x24} + $mat->[1]{x24});
    $mat->[2]{x34} = (short)($mat->[0]{x34} + $mat->[1]{x34});
    $mat->[2]{x44} = (short)($mat->[0]{x44} + $mat->[1]{x44});

    unless ($mat->[2]{x11} == INT16_MIN() + 111) {
      return 0;
    }
    
    unless ($mat->[2]{x21} == 142) {
      return 0;
    }
    unless ($mat->[2]{x31} == 162) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x12} == 124) {
      return 0;
    }
    unless ($mat->[2]{x22} == 144) {
      return 0;
    }
    unless ($mat->[2]{x32} == 164) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x13} == 126) {
      return 0;
    }
    unless ($mat->[2]{x23} == 146) {
      return 0;
    }
    unless ($mat->[2]{x33} == 166) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x44} == 188) {
      return 0;
    }
    
    return 1;
  }

  sub value_array_max_fields_int : int () {
    my $mat = new TestCase::Matrix4_16i[3];
    
    $mat->[0]{x11} = INT32_MIN();
    $mat->[0]{x21} = 21;
    $mat->[0]{x31} = 31;
    $mat->[0]{x41} = 41;
    
    $mat->[0]{x12} = 12;
    $mat->[0]{x22} = 22;
    $mat->[0]{x32} = 32;
    $mat->[0]{x42} = 42;
    
    $mat->[0]{x13} = 13;
    $mat->[0]{x23} = 23;
    $mat->[0]{x33} = 33;
    $mat->[0]{x43} = 43;
    
    $mat->[0]{x14} = 14;
    $mat->[0]{x24} = 24;
    $mat->[0]{x34} = 34;
    $mat->[0]{x44} = 44;

    $mat->[1]{x11} = 111;
    $mat->[1]{x21} = 121;
    $mat->[1]{x31} = 131;
    $mat->[1]{x41} = 141;
    
    $mat->[1]{x12} = 112;
    $mat->[1]{x22} = 122;
    $mat->[1]{x32} = 132;
    $mat->[1]{x42} = 142;
    
    $mat->[1]{x13} = 113;
    $mat->[1]{x23} = 123;
    $mat->[1]{x33} = 133;
    $mat->[1]{x43} = 143;
    
    $mat->[1]{x14} = 114;
    $mat->[1]{x24} = 124;
    $mat->[1]{x34} = 134;
    $mat->[1]{x44} = 144;
    
    $mat->[2]{x11} = $mat->[0]{x11} + $mat->[1]{x11};
    $mat->[2]{x21} = $mat->[0]{x21} + $mat->[1]{x21};
    $mat->[2]{x31} = $mat->[0]{x31} + $mat->[1]{x31};
    $mat->[2]{x41} = $mat->[0]{x41} + $mat->[1]{x41};
    
    $mat->[2]{x12} = $mat->[0]{x12} + $mat->[1]{x12};
    $mat->[2]{x22} = $mat->[0]{x22} + $mat->[1]{x22};
    $mat->[2]{x32} = $mat->[0]{x32} + $mat->[1]{x32};
    $mat->[2]{x42} = $mat->[0]{x42} + $mat->[1]{x42};
    
    $mat->[2]{x13} = $mat->[0]{x13} + $mat->[1]{x13};
    $mat->[2]{x23} = $mat->[0]{x23} + $mat->[1]{x23};
    $mat->[2]{x33} = $mat->[0]{x33} + $mat->[1]{x33};
    $mat->[2]{x43} = $mat->[0]{x43} + $mat->[1]{x43};
    
    $mat->[2]{x14} = $mat->[0]{x14} + $mat->[1]{x14};
    $mat->[2]{x24} = $mat->[0]{x24} + $mat->[1]{x24};
    $mat->[2]{x34} = $mat->[0]{x34} + $mat->[1]{x34};
    $mat->[2]{x44} = $mat->[0]{x44} + $mat->[1]{x44};

    unless ($mat->[2]{x11} == INT32_MIN() + 111) {
      return 0;
    }
    
    unless ($mat->[2]{x21} == 142) {
      return 0;
    }
    unless ($mat->[2]{x31} == 162) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x12} == 124) {
      return 0;
    }
    unless ($mat->[2]{x22} == 144) {
      return 0;
    }
    unless ($mat->[2]{x32} == 164) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x13} == 126) {
      return 0;
    }
    unless ($mat->[2]{x23} == 146) {
      return 0;
    }
    unless ($mat->[2]{x33} == 166) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x44} == 188) {
      return 0;
    }
    
    return 1;
  }

  sub value_array_max_fields_long : int () {
    my $mat = new TestCase::Matrix4_16l[3];
    
    $mat->[0]{x11} = INT64_MIN();
    $mat->[0]{x21} = 21;
    $mat->[0]{x31} = 31;
    $mat->[0]{x41} = 41;
    
    $mat->[0]{x12} = 12;
    $mat->[0]{x22} = 22;
    $mat->[0]{x32} = 32;
    $mat->[0]{x42} = 42;
    
    $mat->[0]{x13} = 13;
    $mat->[0]{x23} = 23;
    $mat->[0]{x33} = 33;
    $mat->[0]{x43} = 43;
    
    $mat->[0]{x14} = 14;
    $mat->[0]{x24} = 24;
    $mat->[0]{x34} = 34;
    $mat->[0]{x44} = 44;

    $mat->[1]{x11} = 111;
    $mat->[1]{x21} = 121;
    $mat->[1]{x31} = 131;
    $mat->[1]{x41} = 141;
    
    $mat->[1]{x12} = 112;
    $mat->[1]{x22} = 122;
    $mat->[1]{x32} = 132;
    $mat->[1]{x42} = 142;
    
    $mat->[1]{x13} = 113;
    $mat->[1]{x23} = 123;
    $mat->[1]{x33} = 133;
    $mat->[1]{x43} = 143;
    
    $mat->[1]{x14} = 114;
    $mat->[1]{x24} = 124;
    $mat->[1]{x34} = 134;
    $mat->[1]{x44} = 144;
    
    $mat->[2]{x11} = $mat->[0]{x11} + $mat->[1]{x11};
    $mat->[2]{x21} = $mat->[0]{x21} + $mat->[1]{x21};
    $mat->[2]{x31} = $mat->[0]{x31} + $mat->[1]{x31};
    $mat->[2]{x41} = $mat->[0]{x41} + $mat->[1]{x41};
    
    $mat->[2]{x12} = $mat->[0]{x12} + $mat->[1]{x12};
    $mat->[2]{x22} = $mat->[0]{x22} + $mat->[1]{x22};
    $mat->[2]{x32} = $mat->[0]{x32} + $mat->[1]{x32};
    $mat->[2]{x42} = $mat->[0]{x42} + $mat->[1]{x42};
    
    $mat->[2]{x13} = $mat->[0]{x13} + $mat->[1]{x13};
    $mat->[2]{x23} = $mat->[0]{x23} + $mat->[1]{x23};
    $mat->[2]{x33} = $mat->[0]{x33} + $mat->[1]{x33};
    $mat->[2]{x43} = $mat->[0]{x43} + $mat->[1]{x43};
    
    $mat->[2]{x14} = $mat->[0]{x14} + $mat->[1]{x14};
    $mat->[2]{x24} = $mat->[0]{x24} + $mat->[1]{x24};
    $mat->[2]{x34} = $mat->[0]{x34} + $mat->[1]{x34};
    $mat->[2]{x44} = $mat->[0]{x44} + $mat->[1]{x44};

    unless ($mat->[2]{x11} == INT64_MIN() + 111) {
      return 0;
    }
    
    unless ($mat->[2]{x21} == 142) {
      return 0;
    }
    unless ($mat->[2]{x31} == 162) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x12} == 124) {
      return 0;
    }
    unless ($mat->[2]{x22} == 144) {
      return 0;
    }
    unless ($mat->[2]{x32} == 164) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x13} == 126) {
      return 0;
    }
    unless ($mat->[2]{x23} == 146) {
      return 0;
    }
    unless ($mat->[2]{x33} == 166) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x44} == 188) {
      return 0;
    }
    
    return 1;
  }

  sub value_array_max_fields_float : int () {
    my $mat = new TestCase::Matrix4_16f[3];
    
    $mat->[0]{x11} = FLT_MIN();
    $mat->[0]{x21} = 21;
    $mat->[0]{x31} = 31;
    $mat->[0]{x41} = 41;
    
    $mat->[0]{x12} = 12;
    $mat->[0]{x22} = 22;
    $mat->[0]{x32} = 32;
    $mat->[0]{x42} = 42;
    
    $mat->[0]{x13} = 13;
    $mat->[0]{x23} = 23;
    $mat->[0]{x33} = 33;
    $mat->[0]{x43} = 43;
    
    $mat->[0]{x14} = 14;
    $mat->[0]{x24} = 24;
    $mat->[0]{x34} = 34;
    $mat->[0]{x44} = 44;

    $mat->[1]{x11} = 111;
    $mat->[1]{x21} = 121;
    $mat->[1]{x31} = 131;
    $mat->[1]{x41} = 141;
    
    $mat->[1]{x12} = 112;
    $mat->[1]{x22} = 122;
    $mat->[1]{x32} = 132;
    $mat->[1]{x42} = 142;
    
    $mat->[1]{x13} = 113;
    $mat->[1]{x23} = 123;
    $mat->[1]{x33} = 133;
    $mat->[1]{x43} = 143;
    
    $mat->[1]{x14} = 114;
    $mat->[1]{x24} = 124;
    $mat->[1]{x34} = 134;
    $mat->[1]{x44} = 144;
    
    $mat->[2]{x11} = $mat->[0]{x11} + $mat->[1]{x11};
    $mat->[2]{x21} = $mat->[0]{x21} + $mat->[1]{x21};
    $mat->[2]{x31} = $mat->[0]{x31} + $mat->[1]{x31};
    $mat->[2]{x41} = $mat->[0]{x41} + $mat->[1]{x41};
    
    $mat->[2]{x12} = $mat->[0]{x12} + $mat->[1]{x12};
    $mat->[2]{x22} = $mat->[0]{x22} + $mat->[1]{x22};
    $mat->[2]{x32} = $mat->[0]{x32} + $mat->[1]{x32};
    $mat->[2]{x42} = $mat->[0]{x42} + $mat->[1]{x42};
    
    $mat->[2]{x13} = $mat->[0]{x13} + $mat->[1]{x13};
    $mat->[2]{x23} = $mat->[0]{x23} + $mat->[1]{x23};
    $mat->[2]{x33} = $mat->[0]{x33} + $mat->[1]{x33};
    $mat->[2]{x43} = $mat->[0]{x43} + $mat->[1]{x43};
    
    $mat->[2]{x14} = $mat->[0]{x14} + $mat->[1]{x14};
    $mat->[2]{x24} = $mat->[0]{x24} + $mat->[1]{x24};
    $mat->[2]{x34} = $mat->[0]{x34} + $mat->[1]{x34};
    $mat->[2]{x44} = $mat->[0]{x44} + $mat->[1]{x44};

    unless ($mat->[2]{x11} == FLT_MIN() + 111) {
      return 0;
    }
    
    unless ($mat->[2]{x21} == 142) {
      return 0;
    }
    unless ($mat->[2]{x31} == 162) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x12} == 124) {
      return 0;
    }
    unless ($mat->[2]{x22} == 144) {
      return 0;
    }
    unless ($mat->[2]{x32} == 164) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x13} == 126) {
      return 0;
    }
    unless ($mat->[2]{x23} == 146) {
      return 0;
    }
    unless ($mat->[2]{x33} == 166) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x44} == 188) {
      return 0;
    }
    
    return 1;
  }

  sub value_array_max_fields_double : int () {
    my $mat = new TestCase::Matrix4_16d[3];
    
    $mat->[0]{x11} = DBL_MIN();
    $mat->[0]{x21} = 21;
    $mat->[0]{x31} = 31;
    $mat->[0]{x41} = 41;
    
    $mat->[0]{x12} = 12;
    $mat->[0]{x22} = 22;
    $mat->[0]{x32} = 32;
    $mat->[0]{x42} = 42;
    
    $mat->[0]{x13} = 13;
    $mat->[0]{x23} = 23;
    $mat->[0]{x33} = 33;
    $mat->[0]{x43} = 43;
    
    $mat->[0]{x14} = 14;
    $mat->[0]{x24} = 24;
    $mat->[0]{x34} = 34;
    $mat->[0]{x44} = 44;

    $mat->[1]{x11} = 111;
    $mat->[1]{x21} = 121;
    $mat->[1]{x31} = 131;
    $mat->[1]{x41} = 141;
    
    $mat->[1]{x12} = 112;
    $mat->[1]{x22} = 122;
    $mat->[1]{x32} = 132;
    $mat->[1]{x42} = 142;
    
    $mat->[1]{x13} = 113;
    $mat->[1]{x23} = 123;
    $mat->[1]{x33} = 133;
    $mat->[1]{x43} = 143;
    
    $mat->[1]{x14} = 114;
    $mat->[1]{x24} = 124;
    $mat->[1]{x34} = 134;
    $mat->[1]{x44} = 144;
    
    $mat->[2]{x11} = $mat->[0]{x11} + $mat->[1]{x11};
    $mat->[2]{x21} = $mat->[0]{x21} + $mat->[1]{x21};
    $mat->[2]{x31} = $mat->[0]{x31} + $mat->[1]{x31};
    $mat->[2]{x41} = $mat->[0]{x41} + $mat->[1]{x41};
    
    $mat->[2]{x12} = $mat->[0]{x12} + $mat->[1]{x12};
    $mat->[2]{x22} = $mat->[0]{x22} + $mat->[1]{x22};
    $mat->[2]{x32} = $mat->[0]{x32} + $mat->[1]{x32};
    $mat->[2]{x42} = $mat->[0]{x42} + $mat->[1]{x42};
    
    $mat->[2]{x13} = $mat->[0]{x13} + $mat->[1]{x13};
    $mat->[2]{x23} = $mat->[0]{x23} + $mat->[1]{x23};
    $mat->[2]{x33} = $mat->[0]{x33} + $mat->[1]{x33};
    $mat->[2]{x43} = $mat->[0]{x43} + $mat->[1]{x43};
    
    $mat->[2]{x14} = $mat->[0]{x14} + $mat->[1]{x14};
    $mat->[2]{x24} = $mat->[0]{x24} + $mat->[1]{x24};
    $mat->[2]{x34} = $mat->[0]{x34} + $mat->[1]{x34};
    $mat->[2]{x44} = $mat->[0]{x44} + $mat->[1]{x44};

    unless ($mat->[2]{x11} == DBL_MIN() + 111) {
      return 0;
    }
    
    unless ($mat->[2]{x21} == 142) {
      return 0;
    }
    unless ($mat->[2]{x31} == 162) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x12} == 124) {
      return 0;
    }
    unless ($mat->[2]{x22} == 144) {
      return 0;
    }
    unless ($mat->[2]{x32} == 164) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x13} == 126) {
      return 0;
    }
    unless ($mat->[2]{x23} == 146) {
      return 0;
    }
    unless ($mat->[2]{x33} == 166) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x41} == 182) {
      return 0;
    }
    unless ($mat->[2]{x42} == 184) {
      return 0;
    }
    unless ($mat->[2]{x43} == 186) {
      return 0;
    }
    unless ($mat->[2]{x44} == 188) {
      return 0;
    }
    
    return 1;
  }
  
  sub array_byte : int () {
    my $nums1 = new TestCase::Point_3b[10];
    $nums1->[9]{x} = (byte)INT8_MIN();
    $nums1->[9]{y} = (byte)(INT8_MIN() + 1);
    $nums1->[9]{z} = (byte)(INT8_MIN() + 2);
    
    my $nums2 = new TestCase::Point_3b[10];
    $nums2->[3] = $nums1->[9];
    
    my $x = $nums2->[3]{x};
    my $y = $nums2->[3]{y};
    my $z = $nums2->[3]{z};
    
    if ($x == INT8_MIN() && $y == (INT8_MIN() + 1) && $z == (INT8_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub array_short : int () {
    
    my $nums1 = new TestCase::Point_3s[10];
    $nums1->[9]{x} = (short)INT16_MIN();
    $nums1->[9]{y} = (short)(INT16_MIN() + 1);
    $nums1->[9]{z} = (short)(INT16_MIN() + 2);
    
    my $nums2 = new TestCase::Point_3s[10];
    $nums2->[3] = $nums1->[9];
    
    my $x = $nums2->[3]{x};
    my $y = $nums2->[3]{y};
    my $z = $nums2->[3]{z};
    
    if ($x == INT16_MIN() && $y == (INT16_MIN() + 1) && $z == (INT16_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub array_int : int () {
    my $nums1 = new TestCase::Point_3i[10];
    $nums1->[9]{x} = INT32_MIN();
    $nums1->[9]{y} = INT32_MIN() + 1;
    $nums1->[9]{z} = INT32_MIN() + 2;
    
    my $nums2 = new TestCase::Point_3i[10];
    $nums2->[3] = $nums1->[9];
    
    my $x = $nums2->[3]{x};
    my $y = $nums2->[3]{y};
    my $z = $nums2->[3]{z};
    
    if ($x == INT32_MIN() && $y == (INT32_MIN() + 1) && $z == (INT32_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub array_long : int () {
    my $nums1 = new TestCase::Point_3l[10];
    $nums1->[9]{x} = INT64_MIN();
    $nums1->[9]{y} = INT64_MIN() + 1;
    $nums1->[9]{z} = INT64_MIN() + 2;
    
    my $nums2 = new TestCase::Point_3l[10];
    $nums2->[3] = $nums1->[9];

    my $x = $nums2->[3]{x};
    my $y = $nums2->[3]{y};
    my $z = $nums2->[3]{z};
    
    if ($x == INT64_MIN() && $y == (INT64_MIN() + 1) && $z == (INT64_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub array_float : int () {
    my $nums1 = new TestCase::Point_3f[10];
    $nums1->[9]{x} = FLT_MIN();
    $nums1->[9]{y} = FLT_MIN() + 0.25f;
    $nums1->[9]{z} = FLT_MIN() + 0.5f;
    
    my $nums2 = new TestCase::Point_3f[10];
    $nums2->[3] = $nums1->[9];

    my $x = $nums2->[3]{x};
    my $y = $nums2->[3]{y};
    my $z = $nums2->[3]{z};
    
    if ($x == FLT_MIN() && $y == (FLT_MIN() + 0.25) && $z == (FLT_MIN() + 0.5)) {
      return 1;
    }
    
    return 0;
  }
  
  sub array_double : int () {
    my $nums1 = new TestCase::Point_3d[10];
    $nums1->[9]{x} = DBL_MIN();
    $nums1->[9]{y} = DBL_MIN() + 0.25;
    $nums1->[9]{z} = DBL_MIN() + 0.5;
    
    my $nums2 = new TestCase::Point_3d[10];
    $nums2->[3] = $nums1->[9];

    my $x = $nums2->[3]{x};
    my $y = $nums2->[3]{y};
    my $z = $nums2->[3]{z};
    
    if ($x == DBL_MIN() && $y == (DBL_MIN() + 0.25) && $z == (DBL_MIN() + 0.5)) {
      return 1;
    }
    
    return 0;
  }
  
  sub array_field_byte : int () {
    my $nums = new TestCase::Point_3b[10];
    $nums->[9]{x} = (byte)INT8_MIN();
    $nums->[9]{y} = (byte)(INT8_MIN() + 1);
    $nums->[9]{z} = (byte)(INT8_MIN() + 2);
    
    my $x = $nums->[9]{x};
    my $y = $nums->[9]{y};
    my $z = $nums->[9]{z};
    
    if ($x == INT8_MIN() && $y == (INT8_MIN() + 1) && $z == (INT8_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub array_field_short : int () {
    
    my $nums = new TestCase::Point_3s[10];
    $nums->[9]{x} = (short)INT16_MIN();
    $nums->[9]{y} = (short)(INT16_MIN() + 1);
    $nums->[9]{z} = (short)(INT16_MIN() + 2);
    
    my $x = $nums->[9]{x};
    my $y = $nums->[9]{y};
    my $z = $nums->[9]{z};
    
    if ($x == INT16_MIN() && $y == (INT16_MIN() + 1) && $z == (INT16_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }
  
  sub array_field_int : int () {
    my $nums = new TestCase::Point_3i[10];
    $nums->[9]{x} = INT32_MIN();
    $nums->[9]{y} = INT32_MIN() + 1;
    $nums->[9]{z} = INT32_MIN() + 2;
    
    my $x = $nums->[9]{x};
    my $y = $nums->[9]{y};
    my $z = $nums->[9]{z};
    
    if ($x == INT32_MIN() && $y == (INT32_MIN() + 1) && $z == (INT32_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub array_field_long : int () {
    my $nums = new TestCase::Point_3l[10];
    $nums->[9]{x} = INT64_MIN();
    $nums->[9]{y} = INT64_MIN() + 1;
    $nums->[9]{z} = INT64_MIN() + 2;
    
    my $x = $nums->[9]{x};
    my $y = $nums->[9]{y};
    my $z = $nums->[9]{z};
    
    if ($x == INT64_MIN() && $y == (INT64_MIN() + 1) && $z == (INT64_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub array_field_float : int () {
    my $nums = new TestCase::Point_3f[10];
    $nums->[9]{x} = FLT_MIN();
    $nums->[9]{y} = FLT_MIN() + 0.25f;
    $nums->[9]{z} = FLT_MIN() + 0.5f;
    
    my $x = $nums->[9]{x};
    my $y = $nums->[9]{y};
    my $z = $nums->[9]{z};
    
    if ($x == FLT_MIN() && $y == (FLT_MIN() + 0.25) && $z == (FLT_MIN() + 0.5)) {
      return 1;
    }
    
    return 0;
  }
  
  sub array_field_double : int () {
    my $nums = new TestCase::Point_3d[10];
    $nums->[9]{x} = DBL_MIN();
    $nums->[9]{y} = DBL_MIN() + 0.25;
    $nums->[9]{z} = DBL_MIN() + 0.5;
    
    my $x = $nums->[9]{x};
    my $y = $nums->[9]{y};
    my $z = $nums->[9]{z};
    
    if ($x == DBL_MIN() && $y == (DBL_MIN() + 0.25) && $z == (DBL_MIN() + 0.5)) {
      return 1;
    }
    
    return 0;
  }

  sub move_byte : int () {
    my $nums1 = new TestCase::Point_3b[10];
    $nums1->[9]{x} = (byte)INT8_MIN();
    $nums1->[9]{y} = (byte)(INT8_MIN() + 1);
    $nums1->[9]{z} = (byte)(INT8_MIN() + 2);
    
    my $nums2 = $nums1;
    
    my $x = $nums2->[9]{x};
    my $y = $nums2->[9]{y};
    my $z = $nums2->[9]{z};
    
    if ($x == INT8_MIN() && $y == (INT8_MIN() + 1) && $z == (INT8_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub move_short : int () {
    
    my $nums1 = new TestCase::Point_3s[10];
    $nums1->[9]{x} = (short)INT16_MIN();
    $nums1->[9]{y} = (short)(INT16_MIN() + 1);
    $nums1->[9]{z} = (short)(INT16_MIN() + 2);
    
    my $nums2 = $nums1;
    
    my $x = $nums2->[9]{x};
    my $y = $nums2->[9]{y};
    my $z = $nums2->[9]{z};
    
    if ($x == INT16_MIN() && $y == (INT16_MIN() + 1) && $z == (INT16_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub move_int : int () {
    my $nums1 = new TestCase::Point_3i[10];
    $nums1->[9]{x} = INT32_MIN();
    $nums1->[9]{y} = INT32_MIN() + 1;
    $nums1->[9]{z} = INT32_MIN() + 2;
    
    my $nums2 = $nums1;
    
    my $x = $nums2->[9]{x};
    my $y = $nums2->[9]{y};
    my $z = $nums2->[9]{z};
    
    if ($x == INT32_MIN() && $y == (INT32_MIN() + 1) && $z == (INT32_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub move_long : int () {
    my $nums1 = new TestCase::Point_3l[10];
    $nums1->[9]{x} = INT64_MIN();
    $nums1->[9]{y} = INT64_MIN() + 1;
    $nums1->[9]{z} = INT64_MIN() + 2;
    
    my $nums2 = $nums1;

    my $x = $nums2->[9]{x};
    my $y = $nums2->[9]{y};
    my $z = $nums2->[9]{z};
    
    if ($x == INT64_MIN() && $y == (INT64_MIN() + 1) && $z == (INT64_MIN() + 2)) {
      return 1;
    }
    
    return 0;
  }

  sub move_float : int () {
    my $nums1 = new TestCase::Point_3f[10];
    $nums1->[9]{x} = FLT_MIN();
    $nums1->[9]{y} = FLT_MIN() + 0.25f;
    $nums1->[9]{z} = FLT_MIN() + 0.5f;
    
    my $nums2 = $nums1;

    my $x = $nums2->[9]{x};
    my $y = $nums2->[9]{y};
    my $z = $nums2->[9]{z};
    
    if ($x == FLT_MIN() && $y == (FLT_MIN() + 0.25) && $z == (FLT_MIN() + 0.5)) {
      return 1;
    }
    
    return 0;
  }
  
  sub move_double : int () {
    my $nums1 = new TestCase::Point_3d[10];
    $nums1->[9]{x} = DBL_MIN();
    $nums1->[9]{y} = DBL_MIN() + 0.25;
    $nums1->[9]{z} = DBL_MIN() + 0.5;
    
    my $nums2 = $nums1;

    my $x = $nums2->[9]{x};
    my $y = $nums2->[9]{y};
    my $z = $nums2->[9]{z};
    
    if ($x == DBL_MIN() && $y == (DBL_MIN() + 0.25) && $z == (DBL_MIN() + 0.5)) {
      return 1;
    }
    
    return 0;
  }

}