module InflectorTestCases
  SingularToPlural = {
    "search"      => "searches",
    "switch"      => "switches",
    "fix"         => "fixes",
    "box"         => "boxes",
    "process"     => "processes",
    "address"     => "addresses",
    "case"        => "cases",
    "stack"       => "stacks",
    "wish"        => "wishes",
    "fish"        => "fish",
    "jeans"       => "jeans",
    "funky jeans" => "funky jeans",
    "my money"    => "my money",

    "category" => "categories",
    "query"    => "queries",
    "ability"  => "abilities",
    "agency"   => "agencies",
    "movie"    => "movies",

    "archive" => "archives",

    "index" => "indices",

    "wife" => "wives",
    "safe" => "saves",
    "half" => "halves",

    "move" => "moves",

    "salesperson" => "salespeople",
    "person"      => "people",

    "spokesman" => "spokesmen",
    "man"       => "men",
    "woman"     => "women",
    "human"     => "humans",

    "basis"       => "bases",
    "diagnosis"   => "diagnoses",
    "diagnosis_a" => "diagnosis_as",

    "datum"       => "data",
    "medium"      => "media",
    "stadium"     => "stadia",
    "analysis"    => "analyses",
    "my_analysis" => "my_analyses",

    "node_child" => "node_children",
    "child"      => "children",

    "experience" => "experiences",
    "day"        => "days",

    "comment"    => "comments",
    "foobar"     => "foobars",
    "newsletter" => "newsletters",

    "old_news" => "old_news",
    "news"     => "news",

    "series"     => "series",
    "miniseries" => "miniseries",
    "species"    => "species",

    "quiz" => "quizzes",

    "perspective" => "perspectives",

    "ox"          => "oxen",
    "photo"       => "photos",
    "buffalo"     => "buffaloes",
    "tomato"      => "tomatoes",
    "dwarf"       => "dwarves",
    "elf"         => "elves",
    "information" => "information",
    "equipment"   => "equipment",
    "bus"         => "buses",
    "status"      => "statuses",
    "status_code" => "status_codes",
    "mouse"       => "mice",

    "louse"     => "lice",
    "house"     => "houses",
    "octopus"   => "octopi",
    "virus"     => "viri",
    "alias"     => "aliases",
    "portfolio" => "portfolios",

    "vertex"    => "vertices",
    "matrix"    => "matrices",
    "matrix_fu" => "matrix_fus",

    "axis"   => "axes",
    "taxi"   => "taxis", # prevents regression
    "testis" => "testes",
    "crisis" => "crises",

    "rice" => "rice",
    "shoe" => "shoes",

    "horse" => "horses",
    "prize" => "prizes",
    "edge"  => "edges",

    "database" => "databases",

    # regression tests against improper inflection regexes
    "|ice"   => "|ices",
    "|ouse"  => "|ouses",
    "slice"  => "slices",
    "police" => "police",
  }

  CamelToUnderscore = {
    "Product"               => "product",
    "SpecialGuest"          => "special_guest",
    "ApplicationController" => "application_controller",
    "Area51Controller"      => "area51_controller",
  }

  UnderscoreToLowerCamel = {
    "product"                => "product",
    "special_guest"          => "specialGuest",
    "application_controller" => "applicationController",
    "area51_controller"      => "area51Controller",
  }

  SymbolToLowerCamel = {
    product:                "product",
    special_guest:          "specialGuest",
    application_controller: "applicationController",
    area51_controller:      "area51Controller",
  }

  CamelToUnderscoreWithoutReverse = {
    "HTMLTidy"           => "html_tidy",
    "HTMLTidyGenerator"  => "html_tidy_generator",
    "FreeBSD"            => "free_bsd",
    "HTML"               => "html",
    "ForceXMLController" => "force_xml_controller",
  }

  CamelWithModuleToUnderscoreWithSlash = {
    "Admin::Product"                     => "admin/product",
    "Users::Commission::Department"      => "users/commission/department",
    "UsersSection::CommissionDepartment" => "users_section/commission_department",
  }

  ClassNameToForeignKeyWithUnderscore = {
    "Person"                          => "person_id",
    "MyApplication::Billing::Account" => "account_id",
  }

  ClassNameToForeignKeyWithoutUnderscore = {
    "Person"                          => "personid",
    "MyApplication::Billing::Account" => "accountid",
  }

  ClassNameToTableName = {
    "PrimarySpokesman" => "primary_spokesmen",
    "NodeChild"        => "node_children",
  }

  UnderscoreToHuman = {
    "employee_salary" => "Employee salary",
    "employee_id"     => "Employee",
    "underground"     => "Underground",
    "_id"             => "Id",
    "_external_id"    => "External",
  }

  UnderscoreToHumanWithKeepIdSuffix = {
    "this_is_a_string_ending_with_id" => "This is a string ending with id",
    "employee_id"                     => "Employee id",
    "employee_id_something_else"      => "Employee id something else",
    "underground"                     => "Underground",
    "_id"                             => "Id",
    "_external_id"                    => "External id",
  }

  UnderscoreToHumanWithoutCapitalize = {
    "employee_salary" => "employee salary",
    "employee_id"     => "employee",
    "underground"     => "underground",
  }

  MixtureToTitleCaseWithKeepIdSuffix = {
    "this_is_a_string_ending_with_id" => "This Is A String Ending With Id",
    "EmployeeId"                      => "Employee Id",
    "Author Id"                       => "Author Id",
  }

  MixtureToTitleCase = {
    "active_record"         => "Active Record",
    "ActiveRecord"          => "Active Record",
    "action web service"    => "Action Web Service",
    "Action Web Service"    => "Action Web Service",
    "Action web service"    => "Action Web Service",
    "actionwebservice"      => "Actionwebservice",
    "Actionwebservice"      => "Actionwebservice",
    "david's code"          => "David's Code",
    "David's code"          => "David's Code",
    "david's Code"          => "David's Code",
    "sgt. pepper's"         => "Sgt. Pepper's",
    "i've just seen a face" => "I've Just Seen A Face",
    "maybe you'll be there" => "Maybe You'll Be There",
    "¿por qué?"             => "¿Por Qué?",
    "Fred’s"                => "Fred’s",
    "Fred`s"                => "Fred`s",
    "this was 'fake news'"  => "This Was 'Fake News'",
  }

  OrdinalNumbers = {
    "-1"    => "-1st",
    "-2"    => "-2nd",
    "-3"    => "-3rd",
    "-4"    => "-4th",
    "-5"    => "-5th",
    "-6"    => "-6th",
    "-7"    => "-7th",
    "-8"    => "-8th",
    "-9"    => "-9th",
    "-10"   => "-10th",
    "-11"   => "-11th",
    "-12"   => "-12th",
    "-13"   => "-13th",
    "-14"   => "-14th",
    "-20"   => "-20th",
    "-21"   => "-21st",
    "-22"   => "-22nd",
    "-23"   => "-23rd",
    "-24"   => "-24th",
    "-100"  => "-100th",
    "-101"  => "-101st",
    "-102"  => "-102nd",
    "-103"  => "-103rd",
    "-104"  => "-104th",
    "-110"  => "-110th",
    "-111"  => "-111th",
    "-112"  => "-112th",
    "-113"  => "-113th",
    "-1000" => "-1000th",
    "-1001" => "-1001st",
    "0"     => "0th",
    "1"     => "1st",
    "2"     => "2nd",
    "3"     => "3rd",
    "4"     => "4th",
    "5"     => "5th",
    "6"     => "6th",
    "7"     => "7th",
    "8"     => "8th",
    "9"     => "9th",
    "10"    => "10th",
    "11"    => "11th",
    "12"    => "12th",
    "13"    => "13th",
    "14"    => "14th",
    "20"    => "20th",
    "21"    => "21st",
    "22"    => "22nd",
    "23"    => "23rd",
    "24"    => "24th",
    "100"   => "100th",
    "101"   => "101st",
    "102"   => "102nd",
    "103"   => "103rd",
    "104"   => "104th",
    "110"   => "110th",
    "111"   => "111th",
    "112"   => "112th",
    "113"   => "113th",
    "1000"  => "1000th",
    "1001"  => "1001st",
  }

  UnderscoresToDashes = {
    "street"                => "street",
    "street_address"        => "street-address",
    "person_street_address" => "person-street-address",
  }

  Irregularities = {
    "person" => "people",
    "man"    => "men",
    "child"  => "children",
    "sex"    => "sexes",
    "move"   => "moves",
    "cow"    => "kine", # Test inflections with different starting letters
    "zombie" => "zombies",
    "genus"  => "genera",
  }

  MixtureToParametize = {
    "Product"              => "product",
    "PrimarySpokesman"     => "primaryspokesman",
    "special_guest"        => "special_guest",
    "Admin::Product"       => "admin-product",
    "admin/product"        => "admin-product",
    "this was 'fake news'" => "this-was-fake-news",
    "david's Code"         => "david-s-code",
  }

  MixtureToParametizeWithUnderscore = {
    "special_guest"        => "special_guest",
    "Admin::Product"       => "Admin_Product",
    "this was 'Fake News'" => "this_was_Fake_News",
    "Admin/Product"        => "Admin_Product",
    "david's Code"         => "david_s_Code",
  }
end
