Files

268 lines
11 KiB
Swift

import XCTest
@testable import GRDB
// https://github.com/rails/rails/blob/v6.0.0.rc1/activesupport/test/inflector_test.rb
class InflectionsTests: GRDBTestCase {
private var originalInflections: Inflections?
override func setUp() {
// Dups the singleton before each test, restoring the original inflections later.
originalInflections = Inflections.default
}
override func tearDown() {
Inflections.default = originalInflections!
}
private var inflectionTestCases: InflectionTestCases {
let url = testBundle.url(forResource: "InflectionsTests", withExtension: "json")!
let data = try! Data(contentsOf: url)
return try! JSONDecoder().decode(InflectionTestCases.self, from: data)
}
func testStartIndexOfLastWord() {
func lastWord(_ string: String) -> String {
String(string.suffix(from: Inflections.startIndexOfLastWord(string)))
}
XCTAssertEqual(lastWord(""), "")
XCTAssertEqual(lastWord(" "), " ")
XCTAssertEqual(lastWord("_"), "_")
XCTAssertEqual(lastWord("player"), "player")
XCTAssertEqual(lastWord("Player"), "Player")
XCTAssertEqual(lastWord("PLAYER"), "PLAYER")
XCTAssertEqual(lastWord(" player"), "player")
XCTAssertEqual(lastWord(" Player"), "Player")
XCTAssertEqual(lastWord(" PLAYER"), "PLAYER")
XCTAssertEqual(lastWord("_player"), "player")
XCTAssertEqual(lastWord("_Player"), "Player")
XCTAssertEqual(lastWord("_PLAYER"), "PLAYER")
XCTAssertEqual(lastWord("player score"), "score")
XCTAssertEqual(lastWord("player Score"), "Score")
XCTAssertEqual(lastWord("Player Score"), "Score")
XCTAssertEqual(lastWord("PLAYER SCORE"), "SCORE")
XCTAssertEqual(lastWord("player_score"), "score")
XCTAssertEqual(lastWord("player_Score"), "Score")
XCTAssertEqual(lastWord("Player_Score"), "Score")
XCTAssertEqual(lastWord("PLAYER_SCORE"), "SCORE")
XCTAssertEqual(lastWord("playerScore"), "Score")
XCTAssertEqual(lastWord("PlayerScore"), "Score")
XCTAssertEqual(lastWord("best player score"), "score")
XCTAssertEqual(lastWord("best player Score"), "Score")
XCTAssertEqual(lastWord("Best Player Score"), "Score")
XCTAssertEqual(lastWord("BEST PLAYER SCORE"), "SCORE")
XCTAssertEqual(lastWord("best_player_score"), "score")
XCTAssertEqual(lastWord("best_player_Score"), "Score")
XCTAssertEqual(lastWord("Best_Player_Score"), "Score")
XCTAssertEqual(lastWord("BEST_PLAYER_SCORE"), "SCORE")
XCTAssertEqual(lastWord("bestPlayerScore"), "Score")
XCTAssertEqual(lastWord("BestPlayerScore"), "Score")
XCTAssertEqual(lastWord("player1"), "player1")
XCTAssertEqual(lastWord("Player1"), "Player1")
XCTAssertEqual(lastWord("PLAYER1"), "PLAYER1")
XCTAssertEqual(lastWord("player score1"), "score1")
XCTAssertEqual(lastWord("player Score1"), "Score1")
XCTAssertEqual(lastWord("Player Score1"), "Score1")
XCTAssertEqual(lastWord("PLAYER SCORE1"), "SCORE1")
XCTAssertEqual(lastWord("player_score1"), "score1")
XCTAssertEqual(lastWord("player_Score1"), "Score1")
XCTAssertEqual(lastWord("Player_Score1"), "Score1")
XCTAssertEqual(lastWord("PLAYER_SCORE1"), "SCORE1")
XCTAssertEqual(lastWord("playerScore1"), "Score1")
XCTAssertEqual(lastWord("PlayerScore1"), "Score1")
}
func testDigitlessRadical() {
XCTAssertEqual("".digitlessRadical, "")
XCTAssertEqual("player".digitlessRadical, "player")
XCTAssertEqual("player0".digitlessRadical, "player")
XCTAssertEqual("player123".digitlessRadical, "player")
}
func testPluralizePlurals() {
XCTAssertEqual("plurals".pluralized, "plurals")
XCTAssertEqual("Plurals".pluralized, "Plurals")
}
func testPluralizeEmptyString() {
XCTAssertEqual("".pluralized, "")
}
func testUncountabilityOfASCIIWord() {
let word = "HTTP"
Inflections.default.uncountableWords([word])
XCTAssertEqual(word.pluralized, word)
XCTAssertEqual(word.singularized, word)
XCTAssertEqual(word.pluralized, word.singularized)
}
func testUncountabilityOfNonASCIIWord() {
let word = "猫"
Inflections.default.uncountableWords([word])
XCTAssertEqual(word.pluralized, word)
XCTAssertEqual(word.singularized, word)
XCTAssertEqual(word.pluralized, word.singularized)
}
func testUncountableWords() {
for word in Inflections.default.uncountables {
XCTAssertEqual(word.pluralized, word)
XCTAssertEqual(word.singularized, word)
XCTAssertEqual(word.pluralized, word.singularized)
}
}
func testUncountableCapitalizedWords() {
for word in Inflections.default.uncountables {
XCTAssertEqual(word.capitalized.pluralized, word.capitalized)
XCTAssertEqual(word.capitalized.singularized, word.capitalized)
XCTAssertEqual(word.capitalized.pluralized, word.capitalized.singularized)
}
}
func testUncountableUppercasedWords() {
for word in Inflections.default.uncountables {
XCTAssertEqual(word.uppercased().pluralized, word.uppercased())
XCTAssertEqual(word.uppercased().singularized, word.uppercased())
XCTAssertEqual(word.uppercased().pluralized, word.uppercased().singularized)
}
}
func testUncountableWordIsNotGreedy() {
let uncountableWord = "ors"
let countableWord = "sponsor"
Inflections.default.uncountableWords([uncountableWord])
XCTAssertEqual(uncountableWord.singularized, uncountableWord)
XCTAssertEqual(uncountableWord.pluralized, uncountableWord)
XCTAssertEqual(uncountableWord.pluralized, uncountableWord.singularized)
XCTAssertEqual(countableWord.singularized, "sponsor")
XCTAssertEqual(countableWord.pluralized, "sponsors")
XCTAssertEqual(countableWord.pluralized.singularized, "sponsor")
}
func testPluralizeSingularWord() {
for (singular, plural) in inflectionTestCases.testCases["SingularToPlural"]! {
XCTAssertEqual(singular.pluralized, plural)
XCTAssertEqual(singular.capitalized.pluralized, plural.capitalized)
let prefixedSingular = "prefixed" + singular.capitalized
let prefixedPlural = "prefixed" + plural.capitalized
XCTAssertEqual(prefixedSingular.pluralized, prefixedPlural)
let suffixedSingular = singular + "123"
let suffixedPlural = plural + "123"
XCTAssertEqual(suffixedSingular.pluralized, suffixedPlural)
}
}
func testSingularizePluralWord() {
for (singular, plural) in inflectionTestCases.testCases["SingularToPlural"]! {
XCTAssertEqual(plural.singularized, singular)
XCTAssertEqual(plural.capitalized.singularized, singular.capitalized)
let prefixedSingular = "prefixed" + singular.capitalized
let prefixedPlural = "prefixed" + plural.capitalized
XCTAssertEqual(prefixedPlural.singularized, prefixedSingular)
let suffixedSingular = singular + "123"
let suffixedPlural = plural + "123"
XCTAssertEqual(suffixedPlural.singularized, suffixedSingular)
}
}
func testPluralizePluralWord() {
for (_, plural) in inflectionTestCases.testCases["SingularToPlural"]! {
XCTAssertEqual(plural.pluralized, plural)
XCTAssertEqual(plural.capitalized.pluralized, plural.capitalized)
let prefixedPlural = "prefixed" + plural.capitalized
XCTAssertEqual(prefixedPlural.pluralized, prefixedPlural)
let suffixedPlural = plural + "123"
XCTAssertEqual(suffixedPlural.pluralized, suffixedPlural)
}
}
func testSingularizeSingularWord() {
for (singular, _) in inflectionTestCases.testCases["SingularToPlural"]! {
XCTAssertEqual(singular.singularized, singular)
XCTAssertEqual(singular.capitalized.singularized, singular.capitalized)
let prefixedSingular = "prefixed" + singular.capitalized
XCTAssertEqual(prefixedSingular.singularized, prefixedSingular)
let suffixedSingular = singular + "123"
XCTAssertEqual(suffixedSingular.singularized, suffixedSingular)
}
}
func testIrregularityBetweenSingularAndPlural() {
for (singular, plural) in inflectionTestCases.testCases["Irregularities"]! {
Inflections.default.irregularSuffix(singular, plural)
XCTAssertEqual(plural.singularized, singular)
XCTAssertEqual(singular.pluralized, plural)
XCTAssertEqual(singular.singularized, singular)
XCTAssertEqual(plural.pluralized, plural)
let prefixedSingular = "prefixed" + singular.capitalized
let prefixedPlural = "prefixed" + plural.capitalized
XCTAssertEqual(prefixedPlural.singularized, prefixedSingular)
XCTAssertEqual(prefixedSingular.pluralized, prefixedPlural)
XCTAssertEqual(prefixedSingular.singularized, prefixedSingular)
XCTAssertEqual(prefixedPlural.pluralized, prefixedPlural)
let suffixedSingular = singular + "123"
let suffixedPlural = plural + "123"
XCTAssertEqual(suffixedPlural.singularized, suffixedSingular)
XCTAssertEqual(suffixedSingular.pluralized, suffixedPlural)
XCTAssertEqual(suffixedSingular.singularized, suffixedSingular)
XCTAssertEqual(suffixedPlural.pluralized, suffixedPlural)
}
}
}
struct InflectionTestCases: Decodable {
var testCases: [String: [(String, String)]]
struct AnyCodingKey: CodingKey {
var stringValue: String
var intValue: Int? { nil }
init?(stringValue: String) {
self.stringValue = stringValue
}
init?(intValue: Int) {
return nil
}
}
init(from decoder: Decoder) throws {
var testCases: [String: [(String, String)]] = [:]
let container = try decoder.container(keyedBy: AnyCodingKey.self)
for key in container.allKeys {
let nested = try container.nestedContainer(keyedBy: AnyCodingKey.self, forKey: key)
for wordKey in nested.allKeys {
let otherWord = try nested.decode(String.self, forKey: wordKey)
testCases[key.stringValue, default: []].append((wordKey.stringValue, otherWord))
}
}
self.testCases = testCases
}
}