//
//  LocalizationTests.swift
//  Astro
//
//  Created by Jason Voll on 2016-08-01.
//  Copyright © 2016 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
@testable import Astro

class StubLocaleChangedListener: LocaleChangedListener {
    var callCount = 0
    func localeDidChange(newLocale: Astro.Locale) {
        callCount += 1
    }
}

class LocalizationUtilTests: AstroTestCase {
    var stubLocaleChangedListener: StubLocaleChangedListener!

    override func setUp() {
        stubLocaleChangedListener = StubLocaleChangedListener()
        Localization.addLocaleChangedListener(stubLocaleChangedListener)
    }

    func testGetsNoChange() {
        AssertNotNil(Localization.language)
        AssertNotNil(Localization.country)
        AssertNotNil(Localization.locale)
        AssertEqual(stubLocaleChangedListener.callCount, b: 0)
    }

    func testSetLanguage() {
        Localization.language = "AR"
        AssertEqual(Localization.language, b: "ar")
        AssertEqual(stubLocaleChangedListener.callCount, b: 1)
    }

    func testSetCountry() {
        Localization.country = "om"
        AssertEqual(Localization.country, b: "OM")
        AssertEqual(stubLocaleChangedListener.callCount, b: 1)
    }

    func testSetLocale() {
        Localization.locale =  Locale(language: "En", country: "ca")
        AssertEqual(Localization.language, b: "en")
        AssertEqual(Localization.country, b: "CA")
        let retrievedLocale = Localization.locale
        AssertEqual(retrievedLocale.language, b: "en")
        AssertEqual(retrievedLocale.country, b: "CA")
        AssertEqual(stubLocaleChangedListener.callCount, b: 1)
    }

    func testTranslate() {
        Localization.language = "en"
        AssertEqual("Basic test result", b: Localization.translate("test_basic"))
        Localization.language = "ar"
        AssertEqual("Basic test result (العربية)", b: Localization.translate("test_basic"))
        AssertEqual(stubLocaleChangedListener.callCount, b: 2)
    }

    func testTranslateInvalidLanguage() {
        Localization.language = "zz"
        // Fall back to english if langauge is invalid
        AssertEqual("Basic test result", b: Localization.translate("test_basic"))
        AssertEqual(stubLocaleChangedListener.callCount, b: 1)
    }

    // Translation key exists but not in the current language. Fall
    // back to default.
    func testTranslateKeyDefault() {
        Localization.language = "ar"
        AssertEqual("Key only in base language", b: Localization.translate("test_default_only"))
        AssertEqual(stubLocaleChangedListener.callCount, b: 1)
    }

    // Key doesn't exist in dictionary, key returned
    func testTranslateInvalidKey() {
        AssertEqual("junk_test_key", b: Localization.translate("junk_test_key"))
        AssertEqual(stubLocaleChangedListener.callCount, b: 0)
    }
}
