forked from smithy-lang/smithy-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RustReservedWordsTest.kt
74 lines (64 loc) · 3.19 KB
/
RustReservedWordsTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package software.amazon.smithy.rust.codegen.core.rustlang
import io.kotest.matchers.shouldBe
import org.junit.jupiter.api.Test
import software.amazon.smithy.codegen.core.Symbol
import software.amazon.smithy.model.shapes.MemberShape
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.model.shapes.Shape
import software.amazon.smithy.model.shapes.UnionShape
import software.amazon.smithy.model.traits.EnumDefinition
import software.amazon.smithy.rust.codegen.core.smithy.MaybeRenamed
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig
import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel
import software.amazon.smithy.rust.codegen.core.util.PANIC
import software.amazon.smithy.rust.codegen.core.util.orNull
import software.amazon.smithy.rust.codegen.core.util.toPascalCase
internal class RustReservedWordSymbolProviderTest {
class Stub : RustSymbolProvider {
override fun config(): RustSymbolProviderConfig = PANIC()
override fun symbolForOperationError(operation: OperationShape): Symbol = PANIC()
override fun symbolForEventStreamError(eventStream: UnionShape): Symbol = PANIC()
override fun toEnumVariantName(definition: EnumDefinition): MaybeRenamed? {
return definition.name.orNull()?.let { MaybeRenamed(it.toPascalCase(), null) }
}
override fun toSymbol(shape: Shape): Symbol {
return Symbol.builder().name(shape.id.name).build()
}
}
@Test
fun `member names are escaped`() {
val model = """
namespace namespace
structure container {
async: String
}
""".trimMargin().asSmithyModel()
val provider = RustReservedWordSymbolProvider(Stub(), model)
provider.toMemberName(
MemberShape.builder().id("namespace#container\$async").target("namespace#Integer").build(),
) shouldBe "r##async"
provider.toMemberName(
MemberShape.builder().id("namespace#container\$self").target("namespace#Integer").build(),
) shouldBe "self_"
}
@Test
fun `enum variant names are updated to avoid conflicts`() {
expectEnumRename("Unknown", MaybeRenamed("UnknownValue", "Unknown"))
expectEnumRename("UnknownValue", MaybeRenamed("UnknownValue_", "UnknownValue"))
expectEnumRename("UnknownOther", MaybeRenamed("UnknownOther", null))
expectEnumRename("Self", MaybeRenamed("SelfValue", "Self"))
expectEnumRename("SelfValue", MaybeRenamed("SelfValue_", "SelfValue"))
expectEnumRename("SelfOther", MaybeRenamed("SelfOther", null))
expectEnumRename("SELF", MaybeRenamed("SelfValue", "Self"))
}
private fun expectEnumRename(original: String, expected: MaybeRenamed) {
val model = "namespace foo".asSmithyModel()
val provider = RustReservedWordSymbolProvider(Stub(), model)
provider.toEnumVariantName(EnumDefinition.builder().name(original).value("foo").build()) shouldBe expected
}
}