gotlin/internal/lang/metadata_test.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)
}
}