Skip to content

Commit b170133

Browse files
authored
Enums (#355)
1 parent bb51484 commit b170133

File tree

9 files changed

+772
-15
lines changed

9 files changed

+772
-15
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ jobs:
116116
DEST_DIR="arkanalyzer"
117117
MAX_RETRIES=10
118118
RETRY_DELAY=3 # Delay between retries in seconds
119-
BRANCH="neo/2025-08-12"
119+
BRANCH="neo/2025-09-03"
120120
121121
for ((i=1; i<=MAX_RETRIES; i++)); do
122122
git clone --depth=1 --branch $BRANCH $REPO_URL $DEST_DIR && break

jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Convert.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,8 @@ fun TypeDto.toEtsType(): EtsType = when (this) {
529529
is ClassTypeDto -> toEtsClassType()
530530

531531
is EnumValueTypeDto -> EtsEnumValueType(
532-
signature = signature.toEtsFieldSignature(),
533-
constant = constant?.toEtsConstant(),
532+
signature = signature.toEtsClassSignature(),
533+
name = name,
534534
)
535535

536536
is FunctionTypeDto -> EtsFunctionType(

jacodb-ets/src/main/kotlin/org/jacodb/ets/dto/Types.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ data class LexicalEnvTypeDto(
7171
@Serializable
7272
@SerialName("EnumValueType")
7373
data class EnumValueTypeDto(
74-
val signature: FieldSignatureDto,
75-
val constant: ConstantDto? = null,
74+
val signature: ClassSignatureDto,
75+
val name: String? = null,
7676
) : TypeDto
7777

7878
@Serializable

jacodb-ets/src/main/kotlin/org/jacodb/ets/model/Type.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,11 +428,15 @@ data class EtsLexicalEnvType(
428428
}
429429

430430
data class EtsEnumValueType(
431-
val signature: EtsFieldSignature,
432-
val constant: EtsConstant? = null,
431+
val signature: EtsClassSignature,
432+
val name: String? = null,
433433
) : EtsType {
434434
override val typeName: String
435-
get() = signature.name
435+
get() = if (name != null) {
436+
"${signature.name}.$name"
437+
} else {
438+
signature.name
439+
}
436440

437441
override fun toString(): String = typeName
438442

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/*
2+
* Copyright 2022 UnitTestBot contributors (utbot.org)
3+
* <p>
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
* <p>
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
* <p>
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.jacodb.ets.test
18+
19+
import org.jacodb.ets.model.EtsClassCategory
20+
import org.jacodb.ets.test.utils.getResourcePath
21+
import org.jacodb.ets.utils.loadEtsFileAutoConvert
22+
import org.junit.jupiter.api.Test
23+
import kotlin.test.assertEquals
24+
import kotlin.test.assertNotNull
25+
import kotlin.test.assertTrue
26+
27+
class EnumTest {
28+
29+
@Test
30+
fun testEnum() {
31+
val path = "/samples/source/lang/enum.ts"
32+
val res = getResourcePath(path)
33+
val file = loadEtsFileAutoConvert(res)
34+
35+
// Count enum classes
36+
val enumClasses = file.allClasses.filter { it.category == EtsClassCategory.ENUM }
37+
assertTrue(enumClasses.size >= 5, "File should have multiple enums")
38+
39+
// Check for specific enum types
40+
val basicEnum = enumClasses.find { it.name == "BasicEnum" }
41+
val stringEnum = enumClasses.find { it.name == "StringEnum" }
42+
val mixedEnum = enumClasses.find { it.name == "MixedEnum" }
43+
44+
assertNotNull(basicEnum, "Should find BasicEnum")
45+
assertNotNull(stringEnum, "Should find StringEnum")
46+
assertNotNull(mixedEnum, "Should find MixedEnum")
47+
48+
// Verify field counts
49+
assertEquals(3, basicEnum.fields.size, "BasicEnum should have 3 fields")
50+
assertEquals(3, stringEnum.fields.size, "StringEnum should have 3 fields")
51+
assertEquals(3, mixedEnum.fields.size, "MixedEnum should have 3 fields")
52+
}
53+
54+
@Test
55+
fun testEnumEdgeCases() {
56+
val path = "/samples/source/lang/enum-edge-cases.ts"
57+
val res = getResourcePath(path)
58+
val file = loadEtsFileAutoConvert(res)
59+
60+
val enumClasses = file.allClasses.filter { it.category == EtsClassCategory.ENUM }
61+
assertTrue(enumClasses.isNotEmpty(), "Edge cases file should have enums")
62+
63+
// Check for specific edge case enums
64+
val emptyEnum = enumClasses.find { it.name == "EmptyEnum" }
65+
val singleEnum = enumClasses.find { it.name == "SingleEnum" }
66+
val floatEnum = enumClasses.find { it.name == "FloatEnum" }
67+
68+
assertNotNull(emptyEnum, "Should find EmptyEnum")
69+
assertNotNull(singleEnum, "Should find SingleEnum")
70+
assertNotNull(floatEnum, "Should find FloatEnum")
71+
72+
// Verify edge case properties
73+
assertEquals(0, emptyEnum.fields.size, "EmptyEnum should have no fields")
74+
assertEquals(1, singleEnum.fields.size, "SingleEnum should have 1 field")
75+
assertEquals(3, floatEnum.fields.size, "FloatEnum should have 3 fields")
76+
}
77+
78+
@Test
79+
fun testEnumModules() {
80+
val path = "/samples/source/lang/enum-modules.ts"
81+
val res = getResourcePath(path)
82+
val file = loadEtsFileAutoConvert(res)
83+
84+
val enumClasses = file.allClasses.filter { it.category == EtsClassCategory.ENUM }
85+
assertTrue(enumClasses.isNotEmpty(), "Modules file should have enums")
86+
87+
// Check for exported enums
88+
val publicEnum = enumClasses.find { it.name == "PublicEnum" }
89+
val constExportEnum = enumClasses.find { it.name == "ConstExportEnum" }
90+
91+
assertNotNull(publicEnum, "Should find PublicEnum")
92+
assertNotNull(constExportEnum, "Should find ConstExportEnum")
93+
94+
// Verify exported enum properties
95+
assertEquals(3, publicEnum.fields.size, "PublicEnum should have 3 fields")
96+
assertEquals(3, constExportEnum.fields.size, "ConstExportEnum should have 3 fields")
97+
}
98+
99+
@Test
100+
fun testEnumUsageInClasses() {
101+
val path = "/samples/source/lang/enum.ts"
102+
val res = getResourcePath(path)
103+
val file = loadEtsFileAutoConvert(res)
104+
105+
// Find class that uses enums
106+
val usageClass = file.allClasses.find { it.name == "EnumUsageExamples" }
107+
assertNotNull(usageClass, "Should find EnumUsageExamples class")
108+
109+
// Verify the class has methods that work with enums
110+
val methods = usageClass.methods
111+
assertTrue(methods.any { it.name == "setColor" }, "Should have setColor method")
112+
assertTrue(methods.any { it.name == "getDirection" }, "Should have getDirection method")
113+
assertTrue(methods.any { it.name == "handleDirection" }, "Should have handleDirection method")
114+
115+
// Check method parameter counts
116+
val setColorMethod = methods.find { it.name == "setColor" }
117+
assertNotNull(setColorMethod, "setColor method should exist")
118+
assertEquals(1, setColorMethod.parameters.size, "setColor should have 1 parameter")
119+
120+
val getDirectionMethod = methods.find { it.name == "getDirection" }
121+
assertNotNull(getDirectionMethod, "getDirection method should exist")
122+
assertEquals(0, getDirectionMethod.parameters.size, "getDirection should have no parameters")
123+
}
124+
125+
@Test
126+
fun testEnumVsClassDistinction() {
127+
val path = "/samples/source/lang/enum.ts"
128+
val res = getResourcePath(path)
129+
val file = loadEtsFileAutoConvert(res)
130+
131+
// Count different class categories
132+
val enumCount = file.allClasses.count { it.category == EtsClassCategory.ENUM }
133+
val classCount = file.allClasses.count { it.category == EtsClassCategory.CLASS }
134+
135+
assertTrue(enumCount > 0, "Should have enum classes")
136+
assertTrue(classCount > 0, "Should have regular classes")
137+
138+
// Verify proper categorization
139+
val basicEnum = file.allClasses.find { it.name == "BasicEnum" }
140+
val usageClass = file.allClasses.find { it.name == "EnumUsageExamples" }
141+
142+
assertNotNull(basicEnum, "Should find BasicEnum")
143+
assertNotNull(usageClass, "Should find EnumUsageExamples")
144+
145+
assertEquals(EtsClassCategory.ENUM, basicEnum.category, "BasicEnum should be categorized as ENUM")
146+
assertEquals(EtsClassCategory.CLASS, usageClass.category, "EnumUsageExamples should be categorized as CLASS")
147+
}
148+
}

jacodb-ets/src/test/kotlin/org/jacodb/ets/test/EtsFromJsonTest.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -609,11 +609,12 @@ class EtsFromJsonTest {
609609
fun testClassCategory() {
610610
val path = "/samples/etsir/ast/lang/enum.ts.json"
611611
val file = loadEtsFileFromResource(path)
612-
val cls = file.classes.first { it.name == "Animal" }
612+
val cls = file.classes.first { it.name == "BasicEnum" }
613613
assertEquals(EtsClassCategory.ENUM, cls.category)
614-
assertEquals(2, cls.fields.size)
615-
assertEquals("Cat", cls.fields[0].name)
616-
assertEquals("Dog", cls.fields[1].name)
614+
assertEquals(3, cls.fields.size)
615+
assertEquals("First", cls.fields[0].name)
616+
assertEquals("Second", cls.fields[1].name)
617+
assertEquals("Third", cls.fields[2].name)
617618
}
618619

619620
@Test

0 commit comments

Comments
 (0)