@@ -46,6 +46,14 @@ describe('singularize', () => {
4646 expect ( singularize ( 'apiSchemata' ) ) . toBe ( 'apiSchema' ) ;
4747 expect ( singularize ( 'SCHEMATA' ) ) . toBe ( 'SCHEMA' ) ;
4848 } ) ;
49+
50+ it ( 'should canonicalize malformed trailing triple-s words' , ( ) => {
51+ expect ( singularize ( 'classs' ) ) . toBe ( 'class' ) ;
52+ expect ( singularize ( 'Classs' ) ) . toBe ( 'Class' ) ;
53+ expect ( singularize ( 'hazardClasss' ) ) . toBe ( 'hazardClass' ) ;
54+ expect ( singularize ( 'hazardClassses' ) ) . toBe ( 'hazardClass' ) ;
55+ expect ( singularize ( 'CLASSS' ) ) . toBe ( 'CLASS' ) ;
56+ } ) ;
4957} ) ;
5058
5159describe ( 'pluralize' , ( ) => {
@@ -55,6 +63,36 @@ describe('pluralize', () => {
5563 expect ( pluralize ( 'Person' ) ) . toBe ( 'People' ) ;
5664 expect ( pluralize ( 'Category' ) ) . toBe ( 'Categories' ) ;
5765 } ) ;
66+
67+ it ( 'should normalize class variants' , ( ) => {
68+ expect ( pluralize ( 'class' ) ) . toBe ( 'classes' ) ;
69+ expect ( pluralize ( 'Class' ) ) . toBe ( 'Classes' ) ;
70+ expect ( pluralize ( 'hazardClass' ) ) . toBe ( 'hazardClasses' ) ;
71+ expect ( pluralize ( 'HazardClass' ) ) . toBe ( 'HazardClasses' ) ;
72+ expect ( pluralize ( 'hazardClasss' ) ) . toBe ( 'hazardClasses' ) ;
73+ expect ( pluralize ( 'classs' ) ) . toBe ( 'classes' ) ;
74+ } ) ;
75+
76+ it ( 'should preserve already-plural Latin words' , ( ) => {
77+ expect ( pluralize ( 'Schemata' ) ) . toBe ( 'Schemata' ) ;
78+ expect ( pluralize ( 'schemata' ) ) . toBe ( 'schemata' ) ;
79+ } ) ;
80+
81+ it . each ( [
82+ [ 'class' , 'classes' ] ,
83+ [ 'glass' , 'glasses' ] ,
84+ [ 'boss' , 'bosses' ] ,
85+ [ 'process' , 'processes' ] ,
86+ [ 'address' , 'addresses' ] ,
87+ [ 'witness' , 'witnesses' ] ,
88+ [ 'abyss' , 'abysses' ] ,
89+ ] ) (
90+ 'should handle -ss noun roundtrip for %s -> %s' ,
91+ ( singularWord , pluralWord ) => {
92+ expect ( pluralize ( singularWord ) ) . toBe ( pluralWord ) ;
93+ expect ( singularize ( pluralWord ) ) . toBe ( singularWord ) ;
94+ }
95+ ) ;
5896} ) ;
5997
6098describe ( 'singularizeLast' , ( ) => {
@@ -69,6 +107,11 @@ describe('singularizeLast', () => {
69107 expect ( singularizeLast ( 'api_schemata' ) ) . toBe ( 'api_schema' ) ;
70108 expect ( singularizeLast ( 'ApiSchemata' ) ) . toBe ( 'ApiSchema' ) ;
71109 } ) ;
110+
111+ it ( 'should normalize malformed class suffixes in the final segment' , ( ) => {
112+ expect ( singularizeLast ( 'hazardClassses' ) ) . toBe ( 'hazardClass' ) ;
113+ expect ( singularizeLast ( 'HazardClassses' ) ) . toBe ( 'HazardClass' ) ;
114+ } ) ;
72115} ) ;
73116
74117describe ( 'pluralizeLast' , ( ) => {
@@ -78,6 +121,13 @@ describe('pluralizeLast', () => {
78121 expect ( pluralizeLast ( 'order_item' ) ) . toBe ( 'order_items' ) ;
79122 expect ( pluralizeLast ( 'OrderItem' ) ) . toBe ( 'OrderItems' ) ;
80123 } ) ;
124+
125+ it ( 'should normalize malformed class suffixes in the final segment' , ( ) => {
126+ expect ( pluralizeLast ( 'hazardClass' ) ) . toBe ( 'hazardClasses' ) ;
127+ expect ( pluralizeLast ( 'HazardClass' ) ) . toBe ( 'HazardClasses' ) ;
128+ expect ( pluralizeLast ( 'hazardClasss' ) ) . toBe ( 'hazardClasses' ) ;
129+ expect ( pluralizeLast ( 'HazardClasss' ) ) . toBe ( 'HazardClasses' ) ;
130+ } ) ;
81131} ) ;
82132
83133describe ( 'distinctPluralize' , ( ) => {
@@ -95,13 +145,23 @@ describe('distinctPluralize', () => {
95145 expect ( distinctPluralize ( 'bus' ) ) . toBe ( 'buses' ) ;
96146 expect ( distinctPluralize ( 'box' ) ) . toBe ( 'boxes' ) ;
97147 } ) ;
148+
149+ it ( 'should normalize malformed class variants' , ( ) => {
150+ expect ( distinctPluralize ( 'classs' ) ) . toBe ( 'classes' ) ;
151+ expect ( distinctPluralize ( 'hazardClasss' ) ) . toBe ( 'hazardClasses' ) ;
152+ } ) ;
98153} ) ;
99154
100155describe ( 'distinctPluralizeLast' , ( ) => {
101156 it ( 'should distinctly pluralize only the last word' , ( ) => {
102157 expect ( distinctPluralizeLast ( 'user_profile' ) ) . toBe ( 'user_profiles' ) ;
103158 expect ( distinctPluralizeLast ( 'UserProfile' ) ) . toBe ( 'UserProfiles' ) ;
104159 } ) ;
160+
161+ it ( 'should normalize malformed class variants in the final segment' , ( ) => {
162+ expect ( distinctPluralizeLast ( 'hazardClasss' ) ) . toBe ( 'hazardClasses' ) ;
163+ expect ( distinctPluralizeLast ( 'HazardClasss' ) ) . toBe ( 'HazardClasses' ) ;
164+ } ) ;
105165} ) ;
106166
107167describe ( 'lcFirst' , ( ) => {
@@ -189,12 +249,20 @@ describe('toFieldName', () => {
189249 expect ( toFieldName ( 'Schemata' ) ) . toBe ( 'schema' ) ;
190250 expect ( toFieldName ( 'ApiSchemata' ) ) . toBe ( 'apiSchema' ) ;
191251 } ) ;
252+
253+ it ( 'should normalize malformed class variants' , ( ) => {
254+ expect ( toFieldName ( 'Classes' ) ) . toBe ( 'class' ) ;
255+ expect ( toFieldName ( 'HazardClasses' ) ) . toBe ( 'hazardClass' ) ;
256+ expect ( toFieldName ( 'HazardClassses' ) ) . toBe ( 'hazardClass' ) ;
257+ } ) ;
192258} ) ;
193259
194260describe ( 'toQueryName' , ( ) => {
195261 it ( 'should convert singular PascalCase to plural camelCase' , ( ) => {
196262 expect ( toQueryName ( 'User' ) ) . toBe ( 'users' ) ;
197263 expect ( toQueryName ( 'OrderItem' ) ) . toBe ( 'orderItems' ) ;
198264 expect ( toQueryName ( 'Category' ) ) . toBe ( 'categories' ) ;
265+ expect ( toQueryName ( 'Class' ) ) . toBe ( 'classes' ) ;
266+ expect ( toQueryName ( 'HazardClass' ) ) . toBe ( 'hazardClasses' ) ;
199267 } ) ;
200268} ) ;
0 commit comments