require File.dirname(__FILE__) + '/abstract_unit' module Ace module Base class Case end end end class InflectorTest < Test::Unit::TestCase SingularToPlural = { "search" => "searches", "switch" => "switches", "fix" => "fixes", "box" => "boxes", "process" => "processes", "address" => "addresses", "case" => "cases", "stack" => "stacks", "wish" => "wishes", "fish" => "fish", "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", "basis" => "bases", "diagnosis" => "diagnoses", "diagnosis_a" => "diagnosis_as", "datum" => "data", "medium" => "media", "analysis" => "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", "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", "testis" => "testes", "crisis" => "crises", "rice" => "rice", "shoe" => "shoes", "horse" => "horses", "prize" => "prizes", "edge" => "edges", "cow" => "kine" } CamelToUnderscore = { "Product" => "product", "SpecialGuest" => "special_guest", "ApplicationController" => "application_controller", "Area51Controller" => "area51_controller" } UnderscoreToLowerCamel = { "product" => "product", "special_guest" => "specialGuest", "application_controller" => "applicationController", "area51_controller" => "area51Controller" } CamelToUnderscoreWithoutReverse = { "HTMLTidy" => "html_tidy", "HTMLTidyGenerator" => "html_tidy_generator", "FreeBSD" => "free_bsd", "HTML" => "html", } 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" } 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' } OrdinalNumbers = { "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', } def test_pluralize_plurals assert_equal "plurals", Inflector.pluralize("plurals") assert_equal "Plurals", Inflector.pluralize("Plurals") end def test_pluralize_empty_string assert_equal "", Inflector.pluralize("") end SingularToPlural.each do |singular, plural| define_method "test_pluralize_#{singular}" do assert_equal(plural, Inflector.pluralize(singular)) assert_equal(plural.capitalize, Inflector.pluralize(singular.capitalize)) end end SingularToPlural.each do |singular, plural| define_method "test_singularize_#{plural}" do assert_equal(singular, Inflector.singularize(plural)) assert_equal(singular.capitalize, Inflector.singularize(plural.capitalize)) end end MixtureToTitleCase.each do |before, titleized| define_method "test_titleize_#{before}" do assert_equal(titleized, Inflector.titleize(before)) end end def test_camelize CamelToUnderscore.each do |camel, underscore| assert_equal(camel, Inflector.camelize(underscore)) end end def test_underscore CamelToUnderscore.each do |camel, underscore| assert_equal(underscore, Inflector.underscore(camel)) end CamelToUnderscoreWithoutReverse.each do |camel, underscore| assert_equal(underscore, Inflector.underscore(camel)) end end def test_camelize_with_module CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore| assert_equal(camel, Inflector.camelize(underscore)) end end def test_underscore_with_slashes CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore| assert_equal(underscore, Inflector.underscore(camel)) end end def test_demodulize assert_equal "Account", Inflector.demodulize("MyApplication::Billing::Account") end def test_foreign_key ClassNameToForeignKeyWithUnderscore.each do |klass, foreign_key| assert_equal(foreign_key, Inflector.foreign_key(klass)) end ClassNameToForeignKeyWithoutUnderscore.each do |klass, foreign_key| assert_equal(foreign_key, Inflector.foreign_key(klass, false)) end end def test_tableize ClassNameToTableName.each do |class_name, table_name| assert_equal(table_name, Inflector.tableize(class_name)) end end def test_classify ClassNameToTableName.each do |class_name, table_name| assert_equal(class_name, Inflector.classify(table_name)) assert_equal(class_name, Inflector.classify("table_prefix." + table_name)) end end def test_classify_with_symbol assert_nothing_raised do assert_equal 'FooBar', Inflector.classify(:foo_bars) end end def test_classify_with_leading_schema_name assert_equal 'FooBar', Inflector.classify('schema.foo_bar') end def test_humanize UnderscoreToHuman.each do |underscore, human| assert_equal(human, Inflector.humanize(underscore)) end end def test_constantize assert_nothing_raised { assert_equal Ace::Base::Case, Inflector.constantize("Ace::Base::Case") } assert_nothing_raised { assert_equal Ace::Base::Case, Inflector.constantize("::Ace::Base::Case") } assert_nothing_raised { assert_equal InflectorTest, Inflector.constantize("InflectorTest") } assert_nothing_raised { assert_equal InflectorTest, Inflector.constantize("::InflectorTest") } assert_raises(NameError) { Inflector.constantize("UnknownClass") } assert_raises(NameError) { Inflector.constantize("An invalid string") } assert_raises(NameError) { Inflector.constantize("InvalidClass\n") } end def test_constantize_doesnt_look_in_parent assert_raises(NameError) { Inflector.constantize("Ace::Base::InflectorTest") } end def test_ordinal OrdinalNumbers.each do |number, ordinalized| assert_equal(ordinalized, Inflector.ordinalize(number)) end end def test_dasherize UnderscoresToDashes.each do |underscored, dasherized| assert_equal(dasherized, Inflector.dasherize(underscored)) end end def test_underscore_as_reverse_of_dasherize UnderscoresToDashes.each do |underscored, dasherized| assert_equal(underscored, Inflector.underscore(Inflector.dasherize(underscored))) end end def test_underscore_to_lower_camel UnderscoreToLowerCamel.each do |underscored, lower_camel| assert_equal(lower_camel, Inflector.camelize(underscored, false)) end end %w{plurals singulars uncountables}.each do |inflection_type| class_eval " def test_clear_#{inflection_type} cached_values = Inflector.inflections.#{inflection_type} Inflector.inflections.clear :#{inflection_type} assert Inflector.inflections.#{inflection_type}.empty?, \"#{inflection_type} inflections should be empty after clear :#{inflection_type}\" Inflector.inflections.instance_variable_set :@#{inflection_type}, cached_values end " end def test_clear_all cached_values = Inflector.inflections.plurals, Inflector.inflections.singulars, Inflector.inflections.uncountables Inflector.inflections.clear :all assert Inflector.inflections.plurals.empty? assert Inflector.inflections.singulars.empty? assert Inflector.inflections.uncountables.empty? Inflector.inflections.instance_variable_set :@plurals, cached_values[0] Inflector.inflections.instance_variable_set :@singulars, cached_values[1] Inflector.inflections.instance_variable_set :@uncountables, cached_values[2] end def test_clear_with_default cached_values = Inflector.inflections.plurals, Inflector.inflections.singulars, Inflector.inflections.uncountables Inflector.inflections.clear assert Inflector.inflections.plurals.empty? assert Inflector.inflections.singulars.empty? assert Inflector.inflections.uncountables.empty? Inflector.inflections.instance_variable_set :@plurals, cached_values[0] Inflector.inflections.instance_variable_set :@singulars, cached_values[1] Inflector.inflections.instance_variable_set :@uncountables, cached_values[2] end Irregularities.each do |irregularity| singular, plural = *irregularity Inflector.inflections do |inflect| define_method("test_irregularity_between_#{singular}_and_#{plural}") do inflect.irregular(singular, plural) assert_equal singular, Inflector.singularize(plural) assert_equal plural, Inflector.pluralize(singular) end end end [ :all, [] ].each do |scope| Inflector.inflections do |inflect| define_method("test_clear_inflections_with_#{scope.kind_of?(Array) ? "no_arguments" : scope}") do # save all the inflections singulars, plurals, uncountables = inflect.singulars, inflect.plurals, inflect.uncountables # clear all the inflections inflect.clear(*scope) assert_equal [], inflect.singulars assert_equal [], inflect.plurals assert_equal [], inflect.uncountables # restore all the inflections singulars.reverse.each { |singular| inflect.singular(*singular) } plurals.reverse.each { |plural| inflect.plural(*plural) } inflect.uncountable(uncountables) assert_equal singulars, inflect.singulars assert_equal plurals, inflect.plurals assert_equal uncountables, inflect.uncountables end end end { :singulars => :singular, :plurals => :plural, :uncountables => :uncountable }.each do |scope, method| Inflector.inflections do |inflect| define_method("test_clear_inflections_with_#{scope}") do # save the inflections values = inflect.send(scope) # clear the inflections inflect.clear(scope) assert_equal [], inflect.send(scope) # restore the inflections if scope == :uncountables inflect.send(method, values) else values.reverse.each { |value| inflect.send(method, *value) } end assert_equal values, inflect.send(scope) end end end end