package TestCase::Lib::SPVM::Time {
  use SPVM::Time;
  
  sub test_time : long () {
    my $time = SPVM::Time->time;
    
    return $time;
  }

  sub test_localtime : SPVM::Time::Info ($time : long) {
    my $time_info = SPVM::Time->localtime($time);
    
    return $time_info;
  }

  sub test_gmtime : SPVM::Time::Info ($time : long) {
    my $time_info = SPVM::Time->gmtime($time);
    
    return $time_info;
  }

  sub test_strptime : int () {
    # strptime
    {
      my $time_info = SPVM::Time->strptime("2019-03-25 12:51:37 GMT", "%Y-%m-%d %H:%M:%S GMT");
      
      unless ($time_info->sec == 37) {
        return 0;
      }
      unless ($time_info->min == 51) {
        return 0;
      }
      unless ($time_info->hour == 12) {
        return 0;
      }
      unless ($time_info->mday == 25) {
        return 0;
      }
      # 3 - 1
      unless ($time_info->mon == 2) {
        return 0;
      }
      # 2019 - 1900
      unless ($time_info->year == 119) {
        return 0;
      }
    }
    
    return 1;
  }

  sub test_strftime : int () {
    # strftime
    {
      my $time_info = SPVM::Time->strptime("2019-03-25 12:51:37 GMT", "%Y-%m-%d %H:%M:%S GMT");
      
      my $str = SPVM::Time->strftime("%Y-%m-%d %H:%M:%S GMT", $time_info);
      
      unless ($str eq "2019-03-25 12:51:37 GMT") {
        return 0;
      }
    }
    
    return 1;
  }

  sub test_timelocal : int () {
    {
      my $time = SPVM::Time->time();
      
      my $time_info = SPVM::Time->localtime($time);
      
      my $time_ret = SPVM::Time->timelocal($time_info);
      
      unless ($time_ret isa long) {
        return 0;
      }
      unless ($time == $time_ret) {
        return 0;
      }
    }
    
    return 1;
  }

  sub test_timegm : int () {
    {
      my $time = SPVM::Time->time();
      
      my $time_info = SPVM::Time->gmtime($time);
      
      my $time_ret = SPVM::Time->timegm($time_info);

      unless ($time_ret isa long) {
        return 0;
      }
      unless ($time == $time_ret) {
        return 0;
      }
    }
    
    return 1;
  }

}