blob: 9511770bf8eb8f2340328aaaab4de66eb9df6c21 [file] [log] [blame]
// 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 TestNSNumberFormatter: XCTestCase {
static var allTests: [(String, (TestNSNumberFormatter) -> () throws -> Void)] {
return [
("test_currencyCode", test_currencyCode),
("test_decimalSeparator", test_decimalSeparator),
("test_currencyDecimalSeparator", test_currencyDecimalSeparator),
("test_alwaysShowDecimalSeparator", test_alwaysShowDecimalSeparator),
("test_groupingSeparator", test_groupingSeparator),
("test_percentSymbol", test_percentSymbol),
("test_zeroSymbol", test_zeroSymbol),
("test_notANumberSymbol", test_notANumberSymbol),
("test_positiveInfinitySymbol", test_positiveInfinitySymbol),
("test_minusSignSymbol", test_minusSignSymbol),
("test_plusSignSymbol", test_plusSignSymbol),
("test_currencySymbol", test_currencySymbol),
("test_exponentSymbol", test_exponentSymbol),
("test_minimumIntegerDigits", test_minimumIntegerDigits),
("test_maximumIntegerDigits", test_maximumIntegerDigits),
("test_minimumFractionDigits", test_minimumFractionDigits),
("test_maximumFractionDigits", test_maximumFractionDigits),
("test_groupingSize", test_groupingSize),
("test_secondaryGroupingSize", test_secondaryGroupingSize),
("test_roundingMode", test_roundingMode),
("test_roundingIncrement", test_roundingIncrement),
("test_formatWidth", test_formatWidth),
("test_formatPosition", test_formatPosition),
("test_multiplier", test_multiplier),
("test_positivePrefix", test_positivePrefix),
("test_positiveSuffix", test_positiveSuffix),
("test_negativePrefix", test_negativePrefix),
("test_negativeSuffix", test_negativeSuffix),
("test_internationalCurrencySymbol", test_internationalCurrencySymbol),
("test_currencyGroupingSeparator", test_currencyGroupingSeparator),
("test_lenient", test_lenient),
("test_minimumSignificantDigits", test_minimumSignificantDigits),
("test_maximumSignificantDigits", test_maximumSignificantDigits),
("test_stringFor", test_stringFor)
]
}
func test_currencyCode() {
// Disabled due to [SR-250]
/*
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .CurrencyStyle
numberFormatter.currencyCode = "T"
numberFormatter.currencyDecimalSeparator = "_"
let formattedString = numberFormatter.stringFromNumber(42)
XCTAssertEqual(formattedString, "Tย 42_00")
*/
}
func test_decimalSeparator() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.decimalSeparator = "-"
let formattedString = numberFormatter.string(from: 42.42)
XCTAssertEqual(formattedString, "42-42")
}
func test_currencyDecimalSeparator() {
// Disabled due to [SR-250]
/*
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .CurrencyStyle
numberFormatter.currencyDecimalSeparator = "-"
numberFormatter.currencyCode = "T"
let formattedString = numberFormatter.stringFromNumber(42.42)
XCTAssertEqual(formattedString, "Tย 42-42")
*/
}
func test_alwaysShowDecimalSeparator() {
let numberFormatter = NumberFormatter()
numberFormatter.decimalSeparator = "-"
numberFormatter.alwaysShowsDecimalSeparator = true
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42-")
}
func test_groupingSeparator() {
let numberFormatter = NumberFormatter()
numberFormatter.usesGroupingSeparator = true
numberFormatter.groupingSeparator = "_"
let formattedString = numberFormatter.string(from: 42_000)
XCTAssertEqual(formattedString, "42_000")
}
func test_percentSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .percent
numberFormatter.percentSymbol = "๐Ÿ’ฏ"
let formattedString = numberFormatter.string(from: 0.42)
XCTAssertEqual(formattedString, "42๐Ÿ’ฏ")
}
func test_zeroSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.zeroSymbol = "โšฝ๏ธ"
let formattedString = numberFormatter.string(from: 0)
XCTAssertEqual(formattedString, "โšฝ๏ธ")
}
var unknownZero: Int = 0
func test_notANumberSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.notANumberSymbol = "๐Ÿ‘ฝ"
let number: Double = -42
let numberObject = NSNumber(value: sqrt(number))
let formattedString = numberFormatter.string(from: numberObject)
XCTAssertEqual(formattedString, "๐Ÿ‘ฝ")
}
func test_positiveInfinitySymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.positiveInfinitySymbol = "๐Ÿš€"
let numberObject = NSNumber(value: Double(42.0) / Double(0))
let formattedString = numberFormatter.string(from: numberObject)
XCTAssertEqual(formattedString, "๐Ÿš€")
}
func test_minusSignSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.minusSign = "๐Ÿ‘Ž"
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "๐Ÿ‘Ž42")
}
func test_plusSignSymbol() {
//FIXME: How do we show the plus sign from a NSNumberFormatter?
// let numberFormatter = NumberFormatter()
// numberFormatter.plusSign = "๐Ÿ‘"
// let formattedString = numberFormatter.stringFromNumber(42)
// XCTAssertEqual(formattedString, "๐Ÿ‘42")
}
func test_currencySymbol() {
// Disabled due to [SR-250]
/*
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .CurrencyStyle
numberFormatter.currencySymbol = "๐Ÿฏ"
numberFormatter.currencyDecimalSeparator = "_"
let formattedString = numberFormatter.stringFromNumber(42)
XCTAssertEqual(formattedString, "๐Ÿฏย 42_00")
*/
}
func test_exponentSymbol() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .scientific
numberFormatter.exponentSymbol = "โฌ†๏ธ"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "4.2โฌ†๏ธ1")
}
func test_minimumIntegerDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.minimumIntegerDigits = 3
let formattedString = numberFormatter.string(from: 0)
XCTAssertEqual(formattedString, "000")
}
func test_maximumIntegerDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.maximumIntegerDigits = 3
let formattedString = numberFormatter.string(from: 1_000)
XCTAssertEqual(formattedString, "000")
}
func test_minimumFractionDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.minimumFractionDigits = 3
numberFormatter.decimalSeparator = "-"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42-000")
}
func test_maximumFractionDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 3
numberFormatter.decimalSeparator = "-"
let formattedString = numberFormatter.string(from: 42.4242)
XCTAssertEqual(formattedString, "42-424")
}
func test_groupingSize() {
let numberFormatter = NumberFormatter()
numberFormatter.groupingSize = 4
numberFormatter.groupingSeparator = "_"
numberFormatter.usesGroupingSeparator = true
let formattedString = numberFormatter.string(from: 42_000)
XCTAssertEqual(formattedString, "4_2000")
}
func test_secondaryGroupingSize() {
let numberFormatter = NumberFormatter()
numberFormatter.secondaryGroupingSize = 2
numberFormatter.groupingSeparator = "_"
numberFormatter.usesGroupingSeparator = true
let formattedString = numberFormatter.string(from: 42_000_000)
XCTAssertEqual(formattedString, "4_20_00_000")
}
func test_roundingMode() {
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 0
numberFormatter.roundingMode = .ceiling
let formattedString = numberFormatter.string(from: 41.0001)
XCTAssertEqual(formattedString, "42")
}
func test_roundingIncrement() {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.roundingIncrement = 0.2
let formattedString = numberFormatter.string(from: 4.25)
XCTAssertEqual(formattedString, "4.2")
}
func test_formatWidth() {
let numberFormatter = NumberFormatter()
numberFormatter.paddingCharacter = "_"
numberFormatter.formatWidth = 5
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "___42")
}
func test_formatPosition() {
let numberFormatter = NumberFormatter()
numberFormatter.paddingCharacter = "_"
numberFormatter.formatWidth = 5
numberFormatter.paddingPosition = .afterPrefix
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "-__42")
}
func test_multiplier() {
let numberFormatter = NumberFormatter()
numberFormatter.multiplier = 2
let formattedString = numberFormatter.string(from: 21)
XCTAssertEqual(formattedString, "42")
}
func test_positivePrefix() {
let numberFormatter = NumberFormatter()
numberFormatter.positivePrefix = "๐Ÿ‘"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "๐Ÿ‘42")
}
func test_positiveSuffix() {
let numberFormatter = NumberFormatter()
numberFormatter.positiveSuffix = "๐Ÿ‘"
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42๐Ÿ‘")
}
func test_negativePrefix() {
let numberFormatter = NumberFormatter()
numberFormatter.negativePrefix = "๐Ÿ‘Ž"
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "๐Ÿ‘Ž42")
}
func test_negativeSuffix() {
let numberFormatter = NumberFormatter()
numberFormatter.negativeSuffix = "๐Ÿ‘Ž"
let formattedString = numberFormatter.string(from: -42)
XCTAssertEqual(formattedString, "-42๐Ÿ‘Ž")
}
func test_internationalCurrencySymbol() {
// Disabled due to [SR-250]
/*
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .CurrencyPluralStyle
numberFormatter.internationalCurrencySymbol = "๐Ÿ’ต"
numberFormatter.currencyDecimalSeparator = "_"
let formattedString = numberFormatter.stringFromNumber(42)
XCTAssertEqual(formattedString, "๐Ÿ’ตย 42_00")
*/
}
func test_currencyGroupingSeparator() {
// Disabled due to [SR-250]
/*
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .CurrencyStyle
numberFormatter.currencyGroupingSeparator = "_"
numberFormatter.currencyCode = "T"
numberFormatter.currencyDecimalSeparator = "/"
let formattedString = numberFormatter.stringFromNumber(42_000)
XCTAssertEqual(formattedString, "Tย 42_000/00")
*/
}
//FIXME: Something is wrong with numberFromString implementation, I don't know exactly why, but it's not working.
func test_lenient() {
// let numberFormatter = NumberFormatter()
// numberFormatter.numberStyle = .CurrencyStyle
// let nilNumberBeforeLenient = numberFormatter.numberFromString("42")
// XCTAssertNil(nilNumberBeforeLenient)
// numberFormatter.lenient = true
// let numberAfterLenient = numberFormatter.numberFromString("42.42")
// XCTAssertEqual(numberAfterLenient, 42.42)
}
func test_minimumSignificantDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.usesSignificantDigits = true
numberFormatter.minimumSignificantDigits = 3
let formattedString = numberFormatter.string(from: 42)
XCTAssertEqual(formattedString, "42.0")
}
func test_maximumSignificantDigits() {
let numberFormatter = NumberFormatter()
numberFormatter.usesSignificantDigits = true
numberFormatter.maximumSignificantDigits = 3
let formattedString = numberFormatter.string(from: 42.42424242)
XCTAssertEqual(formattedString, "42.4")
}
func test_stringFor() {
let numberFormatter = NumberFormatter()
XCTAssertEqual(numberFormatter.string(for: 10)!, "10")
XCTAssertEqual(numberFormatter.string(for: 3.14285714285714)!, "3")
XCTAssertEqual(numberFormatter.string(for: true)!, "1")
XCTAssertEqual(numberFormatter.string(for: false)!, "0")
XCTAssertNil(numberFormatter.string(for: [1,2]))
XCTAssertEqual(numberFormatter.string(for: NSNumber(value: 99.1))!, "99")
XCTAssertNil(numberFormatter.string(for: "NaN"))
XCTAssertNil(numberFormatter.string(for: NSString(string: "NaN")))
}
}