// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef STARBOARD_NPLB_TIME_CONSTANTS_H_
#define STARBOARD_NPLB_TIME_CONSTANTS_H_

#include "starboard/time.h"

namespace starboard {
namespace nplb {

static const SbTime kExtraMillseconds = 123 * kSbTimeMillisecond;
static const SbTime kTestSbTimeYear = 525949 * kSbTimeMinute;

// 1443121328 in POSIX time is
// Thursday, 9/24/2015 19:02:08 UTC
static const SbTime kTestTimePositive =
    SbTimeFromPosix(SB_INT64_C(1443121328) * kSbTimeSecond + kExtraMillseconds);

// 0 in POSIX time is
// Thursday, 1/1/1970 00:00:00 UTC
static const SbTime kTestTimePosixZero =
    SbTimeFromPosix(SB_INT64_C(0) * kSbTimeSecond);

// -771942639 in POSIX time is
// Monday, 7/16/1945 11:29:21 UTC
static const SbTime kTestTimePosixNegative =
    SbTimeFromPosix(SB_INT64_C(-771942639) * kSbTimeSecond);

// 0 in Windows time is
// Monday, 1/1/1601 00:00:00 UTC
static const SbTime kTestTimeWindowsZero = 0;

// -15065654400 in POSIX time is
// Wednesday, 8/3/1492 00:00:00 UTC
static const SbTime kTestTimeWindowsNegative =
    SbTimeFromPosix(SB_INT64_C(-15065654400) * kSbTimeSecond);

// 1443473373 in POSIX time is
// Monday, 9/28/2015 20:49:33 UTC
// NOTE: Update this value once every 5 or so years.
static const SbTime kTestTimeWritten =
    SbTimeFromPosix(SB_INT64_C(1443473373) * kSbTimeSecond);

// 5 years after the time this test was written.
static const SbTime kTestTimePastWritten =
    SbTimeFromPosix(kTestTimeWritten + (5 * kTestSbTimeYear));

}  // namespace nplb
}  // namespace starboard

#endif  // STARBOARD_NPLB_TIME_CONSTANTS_H_
