diff --git a/tests/SwaggerProvider.Tests/SwaggerProvider.Tests.fsproj b/tests/SwaggerProvider.Tests/SwaggerProvider.Tests.fsproj
index c69a40b..36790a6 100644
--- a/tests/SwaggerProvider.Tests/SwaggerProvider.Tests.fsproj
+++ b/tests/SwaggerProvider.Tests/SwaggerProvider.Tests.fsproj
@@ -19,6 +19,7 @@
+
diff --git a/tests/SwaggerProvider.Tests/UtilsTests.fs b/tests/SwaggerProvider.Tests/UtilsTests.fs
new file mode 100644
index 0000000..d4149cf
--- /dev/null
+++ b/tests/SwaggerProvider.Tests/UtilsTests.fs
@@ -0,0 +1,73 @@
+namespace SwaggerProvider.Tests.UtilsTests
+
+open Xunit
+open FsUnitTyped
+open SwaggerProvider.Internal
+
+/// Unit tests for UniqueNameGenerator — used by all DefinitionCompilers and OperationCompilers
+/// to de-duplicate property and method names within a given type scope.
+module UniqueNameGeneratorTests =
+
+ []
+ let ``first use of a name is returned unchanged``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "Foo" |> shouldEqual "Foo"
+
+ []
+ let ``second use of same name gets numeric suffix 1``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "Bar" |> ignore
+ gen.MakeUnique "Bar" |> shouldEqual "Bar1"
+
+ []
+ let ``third use of same name gets numeric suffix 2``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "Bar" |> ignore
+ gen.MakeUnique "Bar" |> ignore
+ gen.MakeUnique "Bar" |> shouldEqual "Bar2"
+
+ []
+ let ``collision detection is case-insensitive``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "Foo" |> ignore
+ // "foo" collides with "Foo" because comparison is case-insensitive
+ gen.MakeUnique "foo" |> shouldEqual "foo1"
+
+ []
+ let ``original casing of the returned name is preserved``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "MyProperty" |> shouldEqual "MyProperty"
+
+ []
+ let ``suffix casing follows the input not the stored key``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "myMethod" |> ignore
+ // Suffix is appended to the original input, preserving its casing
+ gen.MakeUnique "myMethod" |> shouldEqual "myMethod1"
+
+ []
+ let ``different names do not collide``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "Alpha" |> shouldEqual "Alpha"
+ gen.MakeUnique "Beta" |> shouldEqual "Beta"
+ gen.MakeUnique "Gamma" |> shouldEqual "Gamma"
+
+ []
+ let ``numeric suffixes increment sequentially``() =
+ let gen = UniqueNameGenerator()
+ let names = [ for _ in 0..4 -> gen.MakeUnique "X" ]
+ names |> shouldEqual [ "X"; "X1"; "X2"; "X3"; "X4" ]
+
+ []
+ let ``name equal to a previously suffixed name is also de-duplicated``() =
+ // After generating "Op" and "Op1", adding "Op1" should produce "Op11"
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "Op" |> ignore // reserves "op"
+ gen.MakeUnique "Op" |> ignore // reserves "op1"
+ gen.MakeUnique "Op1" |> shouldEqual "Op11" // "op1" is taken → try "op11"
+
+ []
+ let ``empty string is accepted as input``() =
+ let gen = UniqueNameGenerator()
+ gen.MakeUnique "" |> shouldEqual ""
+ gen.MakeUnique "" |> shouldEqual "1"