//===--- Math.swift.gyb ---------------------------------------*- swift -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
// -*- swift -*-
// RUN: %empty-directory(%t)
// RUN: %gyb %s -o %t/tgmath.swift
// RUN: %line-directive %t/tgmath.swift -- %target-build-swift %t/tgmath.swift -o %t/a.out
// RUN: %target-codesign %t/a.out
// RUN: %line-directive %t/tgmath.swift -- %target-run %t/a.out
// REQUIRES: executable_test

#if (arch(i386) || arch(x86_64)) && !os(Windows)
  typealias TestLiteralType = Float80
#else
  typealias TestLiteralType = Double
#endif

import StdlibUnittest

let MathTests = TestSuite("Math")

func expectEqualWithTolerance<T>(_ expected: TestLiteralType, _ actual: T,
                                 ulps allowed: T = 3,
                                 file: String = #file, line: UInt = #line)
                                 where T: BinaryFloatingPoint {
  if actual == T(expected) || actual.isNaN && expected.isNaN {
    return
  }
  //  Compute error in ulp, compare to tolerance.
  let absoluteError = T(abs(TestLiteralType(actual) - expected))
  let ulpError = absoluteError / T(expected).ulp
  expectTrue(ulpError <= allowed,
             "\(actual) != \(expected) as \(T.self)" +
             "\n  \(ulpError)-ulp error exceeds \(allowed)-ulp tolerance.",
             file: file, line: line)
}

%from SwiftMathFunctions import *

@available(macOS 9999, iOS 9999, tvOS 9999, watchOS 9999, *)
internal extension ElementaryFunctions where Self: BinaryFloatingPoint {
  static func elementaryFunctionTests() {
    /* Default tolerance is 3 ulps unless specified otherwise. It's OK to relax
     * this as needed for new platforms, as these tests are *not* intended to
     * validate the math library--they are only intended to check that the
     * Swift bindings are calling the right functions in the math library.    */
    expectEqualWithTolerance(1.1863995522992575361931268186727044683, Self.acos(0.375))
    expectEqualWithTolerance(0.3843967744956390830381948729670469737, Self.asin(0.375))
    expectEqualWithTolerance(0.3587706702705722203959200639264604997, Self.atan(0.375))
    expectEqualWithTolerance(0.9305076219123142911494767922295555080, Self.cos(0.375))
    expectEqualWithTolerance(0.3662725290860475613729093517162641571, Self.sin(0.375))
    expectEqualWithTolerance(0.3936265759256327582294137871012180981, Self.tan(0.375))
    expectEqualWithTolerance(0.4949329230945269058895630995767185785, Self.acosh(1.125))
    expectEqualWithTolerance(0.9670596312833237113713762009167286709, Self.asinh(1.125))
    expectEqualWithTolerance(0.7331685343967135223291211023213964500, Self.atanh(0.625))
    expectEqualWithTolerance(1.0711403467045867672994980155670160493, Self.cosh(0.375))
    expectEqualWithTolerance(0.3838510679136145687542956764205024589, Self.sinh(0.375))
    expectEqualWithTolerance(0.3583573983507859463193602315531580424, Self.tanh(0.375))
    expectEqualWithTolerance(1.4549914146182013360537936919875185083, Self.exp(0.375))
    expectEqualWithTolerance(1.2968395546510096659337541177924511598, Self.exp2(0.375))
    expectEqualWithTolerance(2.3713737056616552616517527574788898386, Self.exp10(0.375))
    expectEqualWithTolerance(0.4549914146182013360537936919875185083, Self.expm1(0.375))
    expectEqualWithTolerance(-0.980829253011726236856451127452003999, Self.log(0.375))
    expectEqualWithTolerance(-1.415037499278843818546261056052183491, Self.log2(0.375))
    expectEqualWithTolerance(0.3184537311185346158102472135905995955, Self.log1p(0.375))
    expectEqualWithTolerance(-0.425968732272281148346188780918363771, Self.log10(0.375))
    expectEqualWithTolerance(-0.7211247851537041911608191553900547941, Self.root(-0.375, 3))
    expectEqualWithTolerance(0.6123724356957945245493210186764728479, Self.sqrt(0.375))
    expectEqualWithTolerance(0.54171335479545025876069682133938570, Self.pow(0.375, 0.625))
    expectEqualWithTolerance(-0.052734375, Self.pow(-0.375, 3))
  }
}

%for T in ['Float', 'Double', 'CGFloat', 'Float80']:
% if T == 'Float80':
#if (arch(i386) || arch(x86_64)) && !os(Windows)
% elif T == 'CGFloat':
#if canImport(CoreGraphics)
  import CoreGraphics
% end

MathTests.test("${T}") {
  if #available(macOS 9999, iOS 9999, tvOS 9999, watchOS 9999, *) {
    ${T}.elementaryFunctionTests()
  }
}

% if T in ['CGFloat', 'Float80']:
#endif
% end
%end

runAllTests()
