// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//

#if DEPLOYMENT_RUNTIME_OBJC || os(Linux)
    import Foundation
    import XCTest
#else
    import SwiftFoundation
    import SwiftXCTest
#endif

class TestNSEnergyFormatter: XCTestCase {
    let formatter: EnergyFormatter = EnergyFormatter()
    
    static var allTests: [(String, (TestNSEnergyFormatter) -> () throws -> Void)] {
        return [
            ("test_stringFromJoulesJoulesRegion", test_stringFromJoulesJoulesRegion),
            ("test_stringFromJoulesCaloriesRegion", test_stringFromJoulesCaloriesRegion),
            ("test_stringFromJoulesCaloriesRegionFoodEnergyUse", test_stringFromJoulesCaloriesRegionFoodEnergyUse),
            ("test_stringFromValue", test_stringFromValue),
            ("test_unitStringFromValue", test_unitStringFromValue),
            ("test_unitStringFromJoules", test_unitStringFromJoules)
        ]
    }
    
    override func setUp() {
        formatter.numberFormatter.locale = Locale(identifier: "en_US")
        formatter.isForFoodEnergyUse = false
        super.setUp()
    }

    func test_stringFromJoulesJoulesRegion() {
        formatter.numberFormatter.locale = Locale(identifier: "de_DE")
        XCTAssertEqual(formatter.string(fromJoules: -100000), "-100 kJ")
        XCTAssertEqual(formatter.string(fromJoules: -1), "-0,001 kJ")
        XCTAssertEqual(formatter.string(fromJoules: 100000000), "100.000 kJ")
    }
    
    
    func test_stringFromJoulesCaloriesRegion() {
        XCTAssertEqual(formatter.string(fromJoules: -10000), "-2.39 kcal")
        XCTAssertEqual(formatter.string(fromJoules: 0.00001), "0 cal")
        XCTAssertEqual(formatter.string(fromJoules: 0.0001), "0 cal")
        XCTAssertEqual(formatter.string(fromJoules: 1), "0.239 cal")
        XCTAssertEqual(formatter.string(fromJoules: 10000), "2.39 kcal")
    }
    
    func test_stringFromJoulesCaloriesRegionFoodEnergyUse() {
        formatter.isForFoodEnergyUse = true
        XCTAssertEqual(formatter.string(fromJoules: -1), "-0 Cal")
        XCTAssertEqual(formatter.string(fromJoules: 0.001), "0 cal")
        XCTAssertEqual(formatter.string(fromJoules: 0.1), "0.024 cal")
        XCTAssertEqual(formatter.string(fromJoules: 1), "0.239 cal")
        XCTAssertEqual(formatter.string(fromJoules: 10000), "2.39 Cal")
    }
    
    func test_stringFromValue() {
        formatter.unitStyle = Formatter.UnitStyle.long
        XCTAssertEqual(formatter.string(fromValue: 0.002, unit: EnergyFormatter.Unit.kilojoule),"0.002 kilojoules")
        XCTAssertEqual(formatter.string(fromValue:0, unit:EnergyFormatter.Unit.joule), "0 joules")
        XCTAssertEqual(formatter.string(fromValue:1, unit:EnergyFormatter.Unit.joule), "1 joule")
        
        formatter.unitStyle = Formatter.UnitStyle.short
        XCTAssertEqual(formatter.string(fromValue: 0.00000001, unit:EnergyFormatter.Unit.kilocalorie), "0kcal")
        XCTAssertEqual(formatter.string(fromValue: 2.4, unit: EnergyFormatter.Unit.calorie), "2.4cal")
        XCTAssertEqual(formatter.string(fromValue: 123456, unit: EnergyFormatter.Unit.calorie), "123,456cal")
        
        formatter.unitStyle = Formatter.UnitStyle.medium
        formatter.isForFoodEnergyUse = true
        XCTAssertEqual(formatter.string(fromValue: 0.00000001, unit: EnergyFormatter.Unit.calorie), "0 cal")
        XCTAssertEqual(formatter.string(fromValue: 987654321, unit: EnergyFormatter.Unit.kilocalorie), "987,654,321 Cal")
        
        formatter.isForFoodEnergyUse = false
        XCTAssertEqual(formatter.string(fromValue: 5.3, unit: EnergyFormatter.Unit.kilocalorie), "5.3 kcal")
        XCTAssertEqual(formatter.string(fromValue: 873.2345, unit: EnergyFormatter.Unit.calorie), "873.234 cal")
    }
    
    func test_unitStringFromJoules() {
        var unit = EnergyFormatter.Unit.joule
        XCTAssertEqual(formatter.unitString(fromJoules: -100000, usedUnit: &unit), "kcal")
        XCTAssertEqual(unit, EnergyFormatter.Unit.kilocalorie)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 0, usedUnit: &unit), "kcal")
        XCTAssertEqual(unit, EnergyFormatter.Unit.kilocalorie)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 0.0001, usedUnit: &unit), "cal")
        XCTAssertEqual(unit, EnergyFormatter.Unit.calorie)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 4184, usedUnit: &unit), "cal")
        XCTAssertEqual(unit, EnergyFormatter.Unit.calorie)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 4185, usedUnit: &unit), "kcal")
        XCTAssertEqual(unit, EnergyFormatter.Unit.kilocalorie)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 100000, usedUnit: &unit), "kcal")
        XCTAssertEqual(unit, EnergyFormatter.Unit.kilocalorie)
        
        formatter.numberFormatter.locale = Locale(identifier: "de_DE")
        XCTAssertEqual(formatter.unitString(fromJoules: -100000, usedUnit: &unit), "kJ")
        XCTAssertEqual(unit, EnergyFormatter.Unit.kilojoule)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 0, usedUnit: &unit), "kJ")
        XCTAssertEqual(unit, EnergyFormatter.Unit.kilojoule)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 0.0001, usedUnit: &unit), "J")
        XCTAssertEqual(unit, EnergyFormatter.Unit.joule)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 1000, usedUnit: &unit), "J")
        XCTAssertEqual(unit, EnergyFormatter.Unit.joule)
        
        XCTAssertEqual(formatter.unitString(fromJoules: 1000.01, usedUnit: &unit), "kJ")
        XCTAssertEqual(unit, EnergyFormatter.Unit.kilojoule)
    }
    
    func test_unitStringFromValue() {
        formatter.isForFoodEnergyUse = true
        formatter.unitStyle = Formatter.UnitStyle.long
        XCTAssertEqual(formatter.unitString(fromValue: 1, unit: EnergyFormatter.Unit.kilocalorie), "Calories")
        XCTAssertEqual(formatter.unitString(fromValue: 2, unit: EnergyFormatter.Unit.kilocalorie), "Calories")
        
        formatter.unitStyle = Formatter.UnitStyle.medium
        XCTAssertEqual(formatter.unitString(fromValue: 0.00000001, unit: EnergyFormatter.Unit.kilocalorie), "Cal")
        XCTAssertEqual(formatter.unitString(fromValue: 987654321, unit: EnergyFormatter.Unit.kilocalorie), "Cal")
        
        formatter.unitStyle = Formatter.UnitStyle.short
        XCTAssertEqual(formatter.unitString(fromValue: 0.00000001, unit: EnergyFormatter.Unit.calorie), "cal")
        XCTAssertEqual(formatter.unitString(fromValue: 123456, unit: EnergyFormatter.Unit.kilocalorie), "C")
        
        formatter.isForFoodEnergyUse = false
        formatter.unitStyle = Formatter.UnitStyle.long
        XCTAssertEqual(formatter.unitString(fromValue: 0.002, unit: EnergyFormatter.Unit.kilojoule), "kilojoules")
        
        formatter.unitStyle = Formatter.UnitStyle.medium
        XCTAssertEqual(formatter.unitString(fromValue: 0.00000001, unit: EnergyFormatter.Unit.kilocalorie), "kcal")
        XCTAssertEqual(formatter.unitString(fromValue: 987654321, unit: EnergyFormatter.Unit.kilocalorie), "kcal")
        
        formatter.unitStyle = Formatter.UnitStyle.short
        XCTAssertEqual(formatter.unitString(fromValue: 0.00000001, unit: EnergyFormatter.Unit.calorie), "cal")
        XCTAssertEqual(formatter.unitString(fromValue: 123456, unit: EnergyFormatter.Unit.joule), "J")
    }

}
