@@ -3,9 +3,17 @@ package org.scalajs.testsuite.compiler
3
3
import org .junit .Assert .*
4
4
import org .junit .Test
5
5
6
+ import scala .concurrent .ExecutionContext .Implicits .{global => globalEc }
7
+ import scala .concurrent .Future
8
+
6
9
import scala .scalajs .js
7
10
import scala .scalajs .js .annotation ._
8
11
12
+ import org .scalajs .junit .async ._
13
+
14
+ import org .scalajs .testsuite .jsinterop .ExportLoopback
15
+ import org .scalajs .testsuite .utils .Platform ._
16
+
9
17
class RegressionTestScala3 {
10
18
import RegressionTestScala3 .*
11
19
@@ -78,6 +86,39 @@ class RegressionTestScala3 {
78
86
val f3 = { () => i += 1 }
79
87
assertSame(f3, Thunk .asFunction0(f3()))
80
88
}
89
+
90
+ @ Test def mandatoryFieldsForSJSSemanticsInNonNativeJSClassIssue14168 (): Unit = {
91
+ val nonNativeJS = new Issue14168 .NonNativeJSClass ().asInstanceOf [js.Dynamic ]
92
+ assertEquals(" string" , nonNativeJS.stringField)
93
+ assertEquals(null , nonNativeJS.nullField)
94
+ assertEquals((), nonNativeJS.unitField)
95
+ assertEquals(true , nonNativeJS.hasOwnProperty(" unitField" ))
96
+ }
97
+
98
+ @ Test def mandatoryFieldsForSJSSemanticsInStaticExportsIssue14168 (): Unit = {
99
+ val staticExports = js.constructorOf[Issue14168 .StaticExports ]
100
+ assertEquals(" string" , staticExports.stringField)
101
+ assertEquals(null , staticExports.nullField)
102
+ assertEquals((), staticExports.unitField)
103
+ assertEquals(true , staticExports.hasOwnProperty(" unitField" ))
104
+ }
105
+
106
+ @ Test def mandatoryFieldsForSJSSemanticsInTopLevelExportsIssue14168 (): AsyncResult = await {
107
+ if (isNoModule) {
108
+ import js .Dynamic .global
109
+ Future {
110
+ assertEquals(" string" , global.RegressionTestScala3_Issue14168_stringField )
111
+ assertEquals(null , global.RegressionTestScala3_Issue14168_nullField )
112
+ assertEquals((), global.RegressionTestScala3_Issue14168_unitField )
113
+ }
114
+ } else {
115
+ for (exports <- ExportLoopback .exportsNamespace) yield {
116
+ assertEquals(" string" , exports.RegressionTestScala3_Issue14168_stringField )
117
+ assertEquals(null , exports.RegressionTestScala3_Issue14168_nullField )
118
+ assertEquals((), exports.RegressionTestScala3_Issue14168_unitField )
119
+ }
120
+ }
121
+ }
81
122
}
82
123
83
124
object RegressionTestScala3 {
@@ -148,6 +189,39 @@ object RegressionTestScala3 {
148
189
val entries = js.Object .entries(obj)
149
190
val js .Tuple2 (k, v) = entries(0 ): @ unchecked
150
191
}
192
+
193
+ object Issue14168 {
194
+ class NonNativeJSClass extends js.Object {
195
+ val stringField : " string" = " string"
196
+ val nullField : Null = null
197
+ val unitField : Unit = ()
198
+ final val finalValField = " finalVal"
199
+ }
200
+
201
+ class StaticExports extends js.Object
202
+
203
+ object StaticExports {
204
+ @ JSExportStatic
205
+ val stringField : " string" = " string"
206
+ @ JSExportStatic
207
+ val nullField : Null = null
208
+ @ JSExportStatic
209
+ val unitField : Unit = ()
210
+ @ JSExportStatic
211
+ final val finalValField = " finalVal"
212
+ }
213
+
214
+ object TopLevelExports {
215
+ @ JSExportTopLevel (" RegressionTestScala3_Issue14168_stringField" )
216
+ val stringField : " string" = " string"
217
+ @ JSExportTopLevel (" RegressionTestScala3_Issue14168_nullField" )
218
+ val nullField : Null = null
219
+ @ JSExportTopLevel (" RegressionTestScala3_Issue14168_unitField" )
220
+ val unitField : Unit = ()
221
+ @ JSExportTopLevel (" RegressionTestScala3_Issue14168_finalValField" )
222
+ final val finalValField = " finalVal"
223
+ }
224
+ }
151
225
}
152
226
153
227
// This class needs to be at the top-level, not in an object, to reproduce the issue
0 commit comments