Files
identcasing/tests/tidentcasing.nim
Jonathan Bernard 663ad994eb Implement generic identifier casing conventions.
AI-Assisted: yes
AI-Tool: OpenAI Codex / gpt-5.4 xhigh
2026-04-11 09:25:16 -05:00

62 lines
3.4 KiB
Nim

import unittest
import identcasing
let canonicalWords = @["naïve", "api", "value"]
suite "identifier casing":
test "renders every supported style":
check renderWords(canonicalWords, upperSnakeCase) == "NAÏVE_API_VALUE"
check renderWords(canonicalWords, lowerSnakeCase) == "naïve_api_value"
check renderWords(canonicalWords, titleSnakeCase) == "Naïve_Api_Value"
check renderWords(canonicalWords, lowerKebabCase) == "naïve-api-value"
check renderWords(canonicalWords, upperKebabCase) == "NAÏVE-API-VALUE"
check renderWords(canonicalWords, trainCase) == "Naïve-Api-Value"
check renderWords(canonicalWords, headerCase) == "Naïve-Api-Value"
check renderWords(canonicalWords, dotCase) == "naïve.api.value"
check renderWords(canonicalWords, lowerCamelCase) == "naïveApiValue"
check renderWords(canonicalWords, pascalCase) == "NaïveApiValue"
test "parses every unambiguous style":
check parseWords("NAÏVE_API_VALUE", upperSnakeCase) == canonicalWords
check parseWords("naïve_api_value", lowerSnakeCase) == canonicalWords
check parseWords("Naïve_Api_Value", titleSnakeCase) == canonicalWords
check parseWords("naïve-api-value", lowerKebabCase) == canonicalWords
check parseWords("NAÏVE-API-VALUE", upperKebabCase) == canonicalWords
check parseWords("Naïve-Api-Value", trainCase) == canonicalWords
check parseWords("naïve.api.value", dotCase) == canonicalWords
check parseWords("naïveApiValue", lowerCamelCase) == canonicalWords
check parseWords("NaïveApiValue", pascalCase) == canonicalWords
test "splits acronym and digit boundaries in camel styles":
check parseWords("URLValue", pascalCase) == @["url", "value"]
check parseWords("version2Value", lowerCamelCase) == @["version2", "value"]
check convertCase("URLValue", pascalCase, lowerKebabCase) == "url-value"
check convertCase("version2Value", lowerCamelCase, lowerSnakeCase) == "version2_value"
test "keeps digits attached to the preceding camel word":
check parseWords("oauth2Client", lowerCamelCase) == @["oauth2", "client"]
check parseWords("ipv6Address", lowerCamelCase) == @["ipv6", "address"]
check convertCase("oauth2Client", lowerCamelCase, lowerKebabCase) == "oauth2-client"
check convertCase("ipv6Address", lowerCamelCase, lowerSnakeCase) == "ipv6_address"
test "does not round-trip standalone numeric segments through camel case":
check convertCase("PBM-123", upperKebabCase, lowerCamelCase) == "pbm123"
check convertCase("pbm123", lowerCamelCase, upperKebabCase) == "PBM123"
test "converts between parseable and rendered styles":
check convertCase("naïveApiValue", lowerCamelCase, upperSnakeCase) == "NAÏVE_API_VALUE"
check convertCase("NaïveApiValue", pascalCase, upperKebabCase) == "NAÏVE-API-VALUE"
check convertCase("naïve_api_value", lowerSnakeCase, trainCase) == "Naïve-Api-Value"
test "supports the existing pairwise helpers":
check lowerKebabCaseToLowerCamelCase("lower-kebab-case") == "lowerKebabCase"
check lowerCamelCaseToLowerKebabCase("lowerCamelCase") == "lower-camel-case"
check lowerKebabCaseToLowerCamelCase("lower-äbc") == "lowerÄbc"
check lowerCamelCaseToLowerKebabCase("lowerÄbc") == "lower-äbc"
test "handles empty values":
check parseWords("", lowerCamelCase) == newSeq[string]()
check renderWords([], lowerCamelCase) == ""
check convertCase("", lowerCamelCase, upperSnakeCase) == ""