268 lines
11 KiB
Swift
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
|
|
}
|
|
}
|