64 lines
2 KiB
Go
64 lines
2 KiB
Go
package lang
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestImportedGotlinClassesPreserveReferenceSemantics(t *testing.T) {
|
|
library, err := Parse(`package platform
|
|
class Lifecycle { fun stopping(): Boolean { return false } }
|
|
fun createLifecycle(): Lifecycle { return Lifecycle() }`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
metadata, err := BuildPackageMetadata(library, "example/platform")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
consumer, err := Parse(`package service
|
|
import platform "example/platform"
|
|
class Worker(val lifecycle: platform.Lifecycle) {
|
|
fun stopped(): Boolean { return lifecycle.stopping() }
|
|
}
|
|
fun create(): platform.Lifecycle { return platform.createLifecycle() }`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
semantic, diagnostics := AnalyzeWithMetadata(consumer, []*PackageMetadata{metadata})
|
|
if len(diagnostics) != 0 {
|
|
t.Fatalf("diagnostics: %#v", diagnostics)
|
|
}
|
|
fieldType := semantic.ClassInfo["Worker"].Fields["lifecycle"].Type
|
|
if _, ok := fieldType.(ImportedClassType); !ok {
|
|
t.Fatalf("type = %#v", fieldType)
|
|
}
|
|
output, err := GenerateGoWithMetadata(consumer, []*PackageMetadata{metadata})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, expected := range []string{"lifecycle *platform.Lifecycle", "func create() *platform.Lifecycle", "platform.CreateLifecycle()"} {
|
|
if !strings.Contains(string(output), expected) {
|
|
t.Fatalf("missing %q:\n%s", expected, output)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestImportedGotlinClassRejectsExplicitPointer(t *testing.T) {
|
|
library, err := Parse(`package platform class Lifecycle`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
metadata, err := BuildPackageMetadata(library, "example/platform")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
consumer, err := Parse(`package service import platform "example/platform" fun use(value: *platform.Lifecycle) {}`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_, diagnostics := AnalyzeWithMetadata(consumer, []*PackageMetadata{metadata})
|
|
if len(diagnostics) == 0 || !strings.Contains(diagnostics[0].Message, "already reference-valued") {
|
|
t.Fatalf("diagnostics: %#v", diagnostics)
|
|
}
|
|
}
|