package TestCase::Std::Math {
  use Std::Math;
  
  sub sin : int () {
    my $value = Std::Math->sin(Std::Math->PI());
    
    if ($value < 0.000001 && $value > -0.000001) {
      return 1;
    }
    return 0;
  }

  sub cos : int () {
    my $value = Std::Math->cos(Std::Math->PI() / 2.0);
    
    if ($value < 0.000001 && $value > -0.000001) {
      return 1;
    }
    return 0;
  }
  
  sub tan : int () {
    my $value = Std::Math->tan(Std::Math->PI() / 4.0);
    
    if ($value - 1.0 < 0.000001 && $value - 1.0 > -0.000001) {
      return 1;
    }
    return 0;
  }

  sub isinff: int () {
    if (Std::Math->isinff(Std::Math->INFINITYF())) {
      if (!Std::Math->isinff(Std::Math->NANF())) {
        if (!Std::Math->isinff(0.1f)) {
          return 1;
        }
      }
    }
    
    return 0;
  }

  sub isfinitef: int () {
    if (!Std::Math->isfinitef(Std::Math->INFINITYF())) {
      if (!Std::Math->isfinitef(Std::Math->NANF())) {
        if (Std::Math->isfinitef(0.1f)) {
          return 1;
        }
      }
    }
    
    return 0;
  }

  sub isnanf: int () {
    if (!Std::Math->isnanf(Std::Math->INFINITYF())) {
      if (Std::Math->isnanf(Std::Math->NANF())) {
        if (!Std::Math->isnanf(0.1f)) {
          return 1;
        }
      }
    }
    
    return 0;
  }
  
  sub float_pass_positive_infinity : int ($value : float) {
    if ($value == Std::Math->INFINITYF()) {
      return 1;
    }
    
    return 0;
  }
  
  sub float_pass_nan : int ($value : float) {
    if (Std::Math->isnanf($value)) {
      return 1;
    }
    
    return 0;
  }

  sub isinf : int () {
    if (Std::Math->isinf(Std::Math->INFINITY())) {
      if (!Std::Math->isinf(Std::Math->NAN())) {
        if (!Std::Math->isinf(0.1)) {
          return 1;
        }
      }
    }
    
    return 0;
  }

  sub isfinite : int () {
    if (!Std::Math->isfinite(Std::Math->INFINITY())) {
      if (!Std::Math->isfinite(Std::Math->NAN())) {
        if (Std::Math->isfinite(0.1)) {
          return 1;
        }
      }
    }
    
    return 0;
  }

  sub isnan : int () {
    if (!Std::Math->isnan(Std::Math->INFINITY())) {
      if (Std::Math->isnan(Std::Math->NAN())) {
        if (!Std::Math->isnan(0.1)) {
          return 1;
        }
      }
    }
    
    return 0;
  }
  
  sub double_pass_nan : int ($value : double) {
    if (Std::Math->isnan($value)) {
      return 1;
    }
    
    return 0;
  }
  
  sub double_pass_positive_infinity : int ($value : double) {
    if ($value == Std::Math->INFINITY()) {
      return 1;
    }
    
    return 0;
  }
}