Skip to content

Commit 5a57683

Browse files
committed
Improve filter and add more tests
1 parent 4142632 commit 5a57683

File tree

2 files changed

+131
-40
lines changed

2 files changed

+131
-40
lines changed

src/FilterFactory.php

+40-38
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,13 @@
1616
use OpenCodeModeling\Filter\Filter\LowerCaseFirst;
1717
use OpenCodeModeling\Filter\Filter\NormalizeLabel;
1818
use OpenCodeModeling\Filter\Filter\UpperCaseFirst;
19-
use OpenCodeModeling\Filter\Filter\UpperToLower;
2019

2120
final class FilterFactory
2221
{
2322
/**
2423
* Returns a normalize filter for labels, names ...
2524
*
26-
* @param callable ...$callables Attached to the end of the filter chain
25+
* @param callable ...$callables Attached to the end of the filter chain
2726
* @return callable
2827
*/
2928
public static function normalizeFilter(callable ...$callables): callable
@@ -38,30 +37,45 @@ public static function normalizeFilter(callable ...$callables): callable
3837
return $filter;
3938
}
4039

40+
/**
41+
* Returns a filter for snake case values e.g. add_building
42+
*
43+
* @return callable
44+
*/
4145
public static function snakeCaseFilter(): callable
4246
{
4347
return self::normalizeFilter(
4448
new Filter\Word\CamelCaseToUnderscore(),
45-
new Filter\StringToLower()
49+
new Filter\StringToLower(),
50+
new Filter\Word\SeparatorToSeparator(' ', '_'),
51+
new Filter\Word\SeparatorToSeparator('-', '_'),
4652
);
4753
}
4854

55+
/**
56+
* Returns a filter for camel case values e.g. addBuilding
57+
*
58+
* @return callable
59+
*/
4960
public static function camelCaseFilter(): callable
5061
{
51-
return new LowerCaseFirst(self::normalizeFilter());
52-
}
53-
54-
public static function pascalCaseFilter(): callable
55-
{
56-
return new UpperCaseFirst(self::normalizeFilter());
62+
return new LowerCaseFirst(
63+
self::normalizeFilter(
64+
new Filter\Word\CamelCaseToUnderscore(),
65+
new Filter\StringToLower(),
66+
new Filter\Word\UnderscoreToCamelCase(),
67+
new Filter\Word\SeparatorToSeparator(' ', '-'),
68+
new Filter\Word\DashToCamelCase()
69+
)
70+
);
5771
}
5872

5973
/**
60-
* Returns a filter for valid class names e.g. AddBuilding
74+
* Returns a filter for pascal case values e.g. AddBuilding
6175
*
6276
* @return callable
6377
*/
64-
public static function classNameFilter(): callable
78+
public static function pascalCaseFilter(): callable
6579
{
6680
return new UpperCaseFirst(
6781
self::normalizeFilter(
@@ -74,6 +88,16 @@ public static function classNameFilter(): callable
7488
);
7589
}
7690

91+
/**
92+
* Returns a filter for valid class names e.g. AddBuilding
93+
*
94+
* @return callable
95+
*/
96+
public static function classNameFilter(): callable
97+
{
98+
return self::pascalCaseFilter();
99+
}
100+
77101
/**
78102
* Returns a filter for valid constant names e.g. ADD_BUILDING
79103
*
@@ -82,9 +106,9 @@ public static function classNameFilter(): callable
82106
public static function constantNameFilter(): callable
83107
{
84108
return self::normalizeFilter(
85-
new Filter\Word\SeparatorToSeparator(' ', '-'),
86-
new Filter\Word\DashToCamelCase(),
87109
new Filter\Word\CamelCaseToUnderscore(),
110+
new Filter\Word\SeparatorToSeparator(' ', '_'),
111+
new Filter\Word\SeparatorToSeparator('-', '_'),
88112
new Filter\StringToUpper()
89113
);
90114
}
@@ -96,12 +120,7 @@ public static function constantNameFilter(): callable
96120
*/
97121
public static function constantValueFilter(): callable
98122
{
99-
return self::normalizeFilter(
100-
new Filter\Word\SeparatorToSeparator(' ', '-'),
101-
new Filter\Word\DashToCamelCase(),
102-
new Filter\Word\CamelCaseToUnderscore(),
103-
new Filter\StringToLower()
104-
);
123+
return self::snakeCaseFilter();
105124
}
106125

107126
/**
@@ -111,15 +130,7 @@ public static function constantValueFilter(): callable
111130
*/
112131
public static function propertyNameFilter(): callable
113132
{
114-
return new LowerCaseFirst(
115-
self::normalizeFilter(
116-
new Filter\Word\CamelCaseToUnderscore(),
117-
new Filter\StringToLower(),
118-
new Filter\Word\UnderscoreToCamelCase(),
119-
new Filter\Word\SeparatorToSeparator(' ', '-'),
120-
new Filter\Word\DashToCamelCase()
121-
)
122-
);
133+
return self::camelCaseFilter();
123134
}
124135

125136
/**
@@ -129,16 +140,7 @@ public static function propertyNameFilter(): callable
129140
*/
130141
public static function methodNameFilter(): callable
131142
{
132-
return new LowerCaseFirst(
133-
self::normalizeFilter(
134-
new Filter\Word\CamelCaseToUnderscore(),
135-
new Filter\StringToLower(),
136-
new Filter\Word\UnderscoreToCamelCase(),
137-
new Filter\Word\SeparatorToSeparator(' ', '-'),
138-
new Filter\Word\DashToCamelCase(),
139-
new UpperToLower()
140-
)
141-
);
143+
return self::camelCaseFilter();
142144
}
143145

144146
/**

tests/FilterFactoryTest.php

+91-2
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,20 @@ public function providerForLabel(): Generator
2929
yield 'AddBuilding' => ['AddBuilding'];
3030
yield ' Add Building ' => [' Add Building '];
3131
yield 'Add building ' => ['Add building '];
32+
yield 'Add BUILDING ' => ['Add BUILDING '];
33+
yield 'ADD BUILDING ' => ['ADD BUILDING '];
3234
yield 'html' => ['Add Building<hr id="null"><div style="text-align: left;">- buildingId: string</div><div style="text-align: left;">- name: string</div>'];
3335
}
3436

37+
/**
38+
* @return Generator<string, array>
39+
*/
40+
public function providerForUpperOnlyLabel(): Generator
41+
{
42+
yield 'ADDBUILDING' => ['ADDBUILDING'];
43+
yield 'html' => ['ADDBUILDING<hr id="null"><div style="text-align: left;">- buildingId: string</div><div style="text-align: left;">- name: string</div>'];
44+
}
45+
3546
/**
3647
* @test
3748
* @dataProvider providerForLabel
@@ -43,6 +54,17 @@ public function it_filters_snake_case(string $label): void
4354
$this->assertSame('add_building', ($filter)($label));
4455
}
4556

57+
/**
58+
* @test
59+
* @dataProvider providerForUpperOnlyLabel
60+
* @param string $label
61+
*/
62+
public function it_filters_snake_case_with_only_upper_letters(string $label): void
63+
{
64+
$filter = FilterFactory::snakeCaseFilter();
65+
$this->assertSame('addbuilding', ($filter)($label));
66+
}
67+
4668
/**
4769
* @test
4870
* @dataProvider providerForLabel
@@ -54,6 +76,17 @@ public function it_filters_camel_case(string $label): void
5476
$this->assertSame('addBuilding', ($filter)($label));
5577
}
5678

79+
/**
80+
* @test
81+
* @dataProvider providerForUpperOnlyLabel
82+
* @param string $label
83+
*/
84+
public function it_filters_camel_case_with_only_upper_letters(string $label): void
85+
{
86+
$filter = FilterFactory::camelCaseFilter();
87+
$this->assertSame('addbuilding', ($filter)($label));
88+
}
89+
5790
/**
5891
* @test
5992
* @dataProvider providerForLabel
@@ -65,6 +98,17 @@ public function it_filters_pascal_case(string $label): void
6598
$this->assertSame('AddBuilding', ($filter)($label));
6699
}
67100

101+
/**
102+
* @test
103+
* @dataProvider providerForUpperOnlyLabel
104+
* @param string $label
105+
*/
106+
public function it_filters_pascal_case_with_only_upper_letters(string $label): void
107+
{
108+
$filter = FilterFactory::pascalCaseFilter();
109+
$this->assertSame('Addbuilding', ($filter)($label));
110+
}
111+
68112
/**
69113
* @test
70114
* @dataProvider providerForLabel
@@ -78,11 +122,12 @@ public function it_filters_method_name(string $label): void
78122

79123
/**
80124
* @test
125+
* @dataProvider providerForUpperOnlyLabel
81126
*/
82-
public function it_filters_method_name_with_only_upper_letters(): void
127+
public function it_filters_method_name_with_only_upper_letters(string $label): void
83128
{
84129
$filter = FilterFactory::methodNameFilter();
85-
$this->assertSame('ny', ($filter)('NY'));
130+
$this->assertSame('addbuilding', ($filter)($label));
86131
}
87132

88133
/**
@@ -96,6 +141,17 @@ public function it_filters_property_name(string $label): void
96141
$this->assertSame('addBuilding', ($filter)($label));
97142
}
98143

144+
/**
145+
* @test
146+
* @dataProvider providerForUpperOnlyLabel
147+
* @param string $label
148+
*/
149+
public function it_filters_property_name_with_only_upper_letters(string $label): void
150+
{
151+
$filter = FilterFactory::propertyNameFilter();
152+
$this->assertSame('addbuilding', ($filter)($label));
153+
}
154+
99155
/**
100156
* @test
101157
* @dataProvider providerForLabel
@@ -107,6 +163,17 @@ public function it_filters_constant_name(string $label): void
107163
$this->assertSame('ADD_BUILDING', ($filter)($label));
108164
}
109165

166+
/**
167+
* @test
168+
* @dataProvider providerForUpperOnlyLabel
169+
* @param string $label
170+
*/
171+
public function it_filters_constant_name_with_only_upper_letters(string $label): void
172+
{
173+
$filter = FilterFactory::constantNameFilter();
174+
$this->assertSame('ADDBUILDING', ($filter)($label));
175+
}
176+
110177
/**
111178
* @test
112179
* @dataProvider providerForLabel
@@ -118,6 +185,17 @@ public function it_filters_constant_value(string $label): void
118185
$this->assertSame('add_building', ($filter)($label));
119186
}
120187

188+
/**
189+
* @test
190+
* @dataProvider providerForUpperOnlyLabel
191+
* @param string $label
192+
*/
193+
public function it_filters_constant_value_with_only_upper_letters(string $label): void
194+
{
195+
$filter = FilterFactory::constantValueFilter();
196+
$this->assertSame('addbuilding', ($filter)($label));
197+
}
198+
121199
/**
122200
* @test
123201
* @dataProvider providerForLabel
@@ -129,6 +207,17 @@ public function it_filters_class_name(string $label): void
129207
$this->assertSame('AddBuilding', ($filter)($label));
130208
}
131209

210+
/**
211+
* @test
212+
* @dataProvider providerForUpperOnlyLabel
213+
* @param string $label
214+
*/
215+
public function it_filters_class_name_with_only_upper_letters(string $label): void
216+
{
217+
$filter = FilterFactory::classNameFilter();
218+
$this->assertSame('Addbuilding', ($filter)($label));
219+
}
220+
132221
/**
133222
* @test
134223
*/

0 commit comments

Comments
 (0)