// 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
import CoreFoundation

class TestNSCalendar: XCTestCase {
    
    static var allTests: [(String, (TestNSCalendar) -> () throws -> Void)] {
        return [
            ("test_gettingDatesOnGregorianCalendar", test_gettingDatesOnGregorianCalendar ),
            ("test_gettingDatesOnHebrewCalendar", test_gettingDatesOnHebrewCalendar ),
            ("test_initializingWithInvalidIdentifier", test_initializingWithInvalidIdentifier),
            ("test_gettingDatesOnChineseCalendar", test_gettingDatesOnChineseCalendar),
            // Disabled because this fails on linux https://bugs.swift.org/browse/SR-320
            // ("test_currentCalendarRRstability", test_currentCalendarRRstability),
        ]
    }
    
    func test_gettingDatesOnGregorianCalendar() {
        let date = NSDate(timeIntervalSince1970: 1449332351)
        
        let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
        calendar?.timeZone = NSTimeZone(name: "UTC")!
        guard let components = calendar?.components([.year, .month, .day], from: date) else {
            XCTFail("Could not get date from the calendar")
            return
        }
        
        XCTAssertEqual(components.year, 2015)
        XCTAssertEqual(components.month, 12)
        XCTAssertEqual(components.day, 5)
    }
    
    func test_gettingDatesOnHebrewCalendar() {
        let date = NSDate(timeIntervalSince1970: 1552580351)
        
        let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierHebrew)
        calendar?.timeZone = NSTimeZone(name: "UTC")!
        guard let components = calendar?.components([.year, .month, .day], from: date) else {
            XCTFail("Could not get date from the Hebrew calendar")
            return
        }
        XCTAssertEqual(components.year, 5779)
        XCTAssertEqual(components.month, 7)
        XCTAssertEqual(components.day, 7)
        XCTAssertFalse(components.leapMonth)
    }
    
    func test_gettingDatesOnChineseCalendar() {
        let date = NSDate(timeIntervalSince1970: 1591460351.0)
        
        let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)
        calendar?.timeZone = NSTimeZone(name: "UTC")!
        guard let components = calendar?.components([.year, .month, .day], from: date) else {
            XCTFail("Could not get date from the Chinese calendar")
            return
        }
        XCTAssertEqual(components.year, 37)
        XCTAssertEqual(components.month, 4)
        XCTAssertEqual(components.day, 15)
        XCTAssertTrue(components.leapMonth)
    }
    
    func test_initializingWithInvalidIdentifier() {
        let calendar = NSCalendar(calendarIdentifier: "nonexistant_calendar")
        XCTAssertNil(calendar)
    }
    
    func test_currentCalendarRRstability() {
        var AMSymbols = [String]()
        for _ in 1...10 {
            let cal = NSCalendar.currentCalendar()
            AMSymbols.append(cal.AMSymbol)
        }
        
        XCTAssertEqual(AMSymbols.count, 10, "Accessing current calendar should work over multiple callouts")
    }
}