@@ -1,6 +1,16 @@
1−{-# LANGUAGE DeriveGeneric, FlexibleInstances, FlexibleContexts, DeriveAnyClass #-}
1+{-# LANGUAGE
2+ DeriveGeneric
3+ , FlexibleInstances
4+ , FlexibleContexts
5+ , DeriveAnyClass
6+ , ScopedTypeVariables
7+ , TypeApplications
8+ , DataKinds
9+ , TypeOperators
10+ , AllowAmbiguousTypes
11+ #-}
212import Test.HUnit
3−import ProjectM36.Tupleable
13+import ProjectM36.Tupleable.Deriving
414import ProjectM36.Atomable
515import ProjectM36.Attribute
616import ProjectM36.Error
@@ -58,6 +68,13 @@ data Test9T = Test9C
5868 attr9C :: Double
5969 }
6070 deriving (Generic, Show, Eq)
71+
72+data Test10T = Test10C {
73+ longAttrNameA10 :: Integer,
74+ long_attr_name_b10 :: Integer,
75+ longMixed_attr_NameC10 :: Integer
76+ }
77+ deriving (Generic, Show, Eq)
6178
6279instance Tupleable Test1T
6380
@@ -83,7 +100,7 @@ main = do
83100 if errors tcounts + failures tcounts > 0 then exitFailure else exitSuccess
84101
85102testList :: Test
86−testList = TestList [testADT1, testADT2, testADT3, testADT4, testADT6, testADT7, testADT8, testInsertExpr, testDefineExpr, testUpdateExpr, testUpdateExprEmptyAttrs, testDeleteExpr, testUpdateExprWrongAttr, testReorderedTuple]
103+testList = TestList [testADT1, testADT2, testADT3, testADT4, testADT6, testADT7, testADT8, testInsertExpr, testDefineExpr, testUpdateExpr, testUpdateExprEmptyAttrs, testDeleteExpr, testUpdateExprWrongAttr, testReorderedTuple, testAddPrefixField, testDropPrefixField, testAddSuffixField, testDropSuffixField, testUpperCaseField, testLowerCaseField, testTitleCaseField, testCamelCaseField, testPascalCaseField, testSnakeCaseField, testSpinalCaseField, testTrainCaseField, testAsIsCodec, testAsIsField, testComposeRLCodec, testComposeRLField, testComposeLRCodec, testComposeLRField]
87104
88105testADT1 :: Test
89106testADT1 = TestCase $ assertEqual "one record constructor" (Right example) (fromTuple (toTuple example))
@@ -200,3 +217,153 @@ testReorderedTuple = TestCase $ do
200217 attrC = 4}
201218 actual = fromTuple . tupleRev . toTuple $ expected
202219 assertEqual "reordered tuple" (Right expected) actual
220+
221+testCodec :: forall tag. ModifyOptions tag => String -> [AttributeName] -> Test
222+testCodec msg expected = TestCase $
223+ assertEqual msg (S.fromList expected) actual
224+ where
225+ actual = attributeNameSet $ toAttributes (Proxy :: Proxy (Codec tag Test10T))
226+
227+testAddPrefixField :: Test
228+testAddPrefixField = testCodec
229+ @(Field (AddPrefix "prefix_"))
230+ "codec field add prefix attributes"
231+ ["prefix_longAttrNameA10",
232+ "prefix_long_attr_name_b10",
233+ "prefix_longMixed_attr_NameC10"]
234+
235+testDropPrefixField :: Test
236+testDropPrefixField = testCodec
237+ @(Field (DropPrefix "long"))
238+ "codec field drop prefix"
239+ ["AttrNameA10",
240+ "_attr_name_b10",
241+ "Mixed_attr_NameC10"]
242+
243+testAddSuffixField :: Test
244+testAddSuffixField = testCodec
245+ @(Field (AddSuffix "_suffix"))
246+ "codec field add suffix"
247+ ["longAttrNameA10_suffix",
248+ "long_attr_name_b10_suffix",
249+ "longMixed_attr_NameC10_suffix"]
250+
251+testDropSuffixField :: Test
252+testDropSuffixField = testCodec
253+ @(Field (DropSuffix "10"))
254+ "codec field drop suffix"
255+ ["longAttrNameA",
256+ "long_attr_name_b",
257+ "longMixed_attr_NameC"]
258+
259+testUpperCaseField :: Test
260+testUpperCaseField = testCodec
261+ @(Field UpperCase)
262+ "codec field uppercase"
263+ ["LONGATTRNAMEA10",
264+ "LONG_ATTR_NAME_B10",
265+ "LONGMIXED_ATTR_NAMEC10"]
266+
267+testLowerCaseField :: Test
268+testLowerCaseField = testCodec
269+ @(Field LowerCase)
270+ "codec field lowercase"
271+ ["longattrnamea10",
272+ "long_attr_name_b10",
273+ "longmixed_attr_namec10"]
274+
275+testTitleCaseField :: Test
276+testTitleCaseField = testCodec
277+ @(Field TitleCase)
278+ "codec field title case"
279+ ["Long Attr Name A10",
280+ "Long Attr Name B10",
281+ "Long Mixed Attr Name C10"]
282+
283+testCamelCaseField :: Test
284+testCamelCaseField = testCodec
285+ @(Field CamelCase)
286+ "codec field camel case"
287+ ["longAttrNameA10",
288+ "longAttrNameB10",
289+ "longMixedAttrNameC10"]
290+
291+testPascalCaseField :: Test
292+testPascalCaseField = testCodec
293+ @(Field PascalCase)
294+ "codec field pascal case"
295+ ["LongAttrNameA10",
296+ "LongAttrNameB10",
297+ "LongMixedAttrNameC10"]
298+
299+testSnakeCaseField :: Test
300+testSnakeCaseField = testCodec
301+ @(Field SnakeCase)
302+ "codec field snake case"
303+ ["long_attr_name_a10",
304+ "long_attr_name_b10",
305+ "long_mixed_attr_name_c10"]
306+
307+testSpinalCaseField :: Test
308+testSpinalCaseField = testCodec
309+ @(Field SpinalCase)
310+ "codec field spinal case"
311+ ["long-attr-name-a10",
312+ "long-attr-name-b10",
313+ "long-mixed-attr-name-c10"]
314+
315+testTrainCaseField :: Test
316+testTrainCaseField = testCodec
317+ @(Field TrainCase)
318+ "codec field train case"
319+ ["Long-Attr-Name-A10",
320+ "Long-Attr-Name-B10",
321+ "Long-Mixed-Attr-Name-C10"]
322+
323+testAsIsCodec :: Test
324+testAsIsCodec = testCodec
325+ @AsIs
326+ "codec as is"
327+ ["longAttrNameA10",
328+ "long_attr_name_b10",
329+ "longMixed_attr_NameC10"]
330+
331+testAsIsField :: Test
332+testAsIsField = testCodec
333+ @(Field AsIs)
334+ "codec field as is"
335+ ["longAttrNameA10",
336+ "long_attr_name_b10",
337+ "longMixed_attr_NameC10"]
338+
339+testComposeRLCodec :: Test
340+testComposeRLCodec = testCodec
341+ @(Field UpperCase <<< Field (DropPrefix "long"))
342+ "codec (<<<)"
343+ ["ATTRNAMEA10",
344+ "_ATTR_NAME_B10",
345+ "MIXED_ATTR_NAMEC10"]
346+
347+testComposeRLField :: Test
348+testComposeRLField = testCodec
349+ @(Field (UpperCase <<< DropPrefix "long"))
350+ "codec field (<<<)"
351+ ["ATTRNAMEA10",
352+ "_ATTR_NAME_B10",
353+ "MIXED_ATTR_NAMEC10"]
354+
355+testComposeLRCodec :: Test
356+testComposeLRCodec = testCodec
357+ @(Field (DropPrefix "long") >>> Field UpperCase)
358+ "codec (>>>)"
359+ ["ATTRNAMEA10",
360+ "_ATTR_NAME_B10",
361+ "MIXED_ATTR_NAMEC10"]
362+
363+testComposeLRField :: Test
364+testComposeLRField = testCodec
365+ @(Field (DropPrefix "long" >>> UpperCase))
366+ "codec field (>>>)"
367+ ["ATTRNAMEA10",
368+ "_ATTR_NAME_B10",
369+ "MIXED_ATTR_NAMEC10"]