Expand Gotlin language and tooling
This commit is contained in:
parent
8f4f858d86
commit
de1262b4cf
41 changed files with 6059 additions and 379 deletions
|
|
@ -867,6 +867,183 @@ worker Counter {
|
|||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoRejectsValReassignment(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
||||
fun main() {
|
||||
val count = 0
|
||||
count = 1
|
||||
}
|
||||
|
||||
`
|
||||
|
||||
prog, err := Parse(src)
|
||||
if err != nil {
|
||||
t.Fatalf("parse failed: %v", err)
|
||||
}
|
||||
_, err = GenerateGo(prog)
|
||||
if err == nil {
|
||||
t.Fatal("expected val reassignment error")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "cannot reassign immutable name count") {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoDefer(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
||||
import database.sql
|
||||
|
||||
fun main() {
|
||||
val rows = sql.Open("postgres", "dsn")
|
||||
defer rows.Close()
|
||||
}
|
||||
|
||||
`
|
||||
prog, err := Parse(src)
|
||||
if err != nil {
|
||||
t.Fatalf("parse failed: %v", err)
|
||||
}
|
||||
out, err := GenerateGo(prog)
|
||||
if err != nil {
|
||||
t.Fatalf("go generation failed: %v", err)
|
||||
}
|
||||
if !strings.Contains(string(out), "defer rows.Close()") {
|
||||
t.Fatalf("generated Go missing defer:\n%s", out)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoDecimalLiteral(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
||||
fun interest(): Double {
|
||||
return 0.025
|
||||
}
|
||||
`
|
||||
prog, err := Parse(src)
|
||||
if err != nil {
|
||||
t.Fatalf("parse failed: %v", err)
|
||||
}
|
||||
out, err := GenerateGo(prog)
|
||||
if err != nil {
|
||||
t.Fatalf("go generation failed: %v", err)
|
||||
}
|
||||
for _, want := range []string{"func interest() float64", "return 0.025"} {
|
||||
if !strings.Contains(string(out), want) {
|
||||
t.Fatalf("generated Go missing %q:\n%s", want, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoRejectsMultiValReassignment(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
||||
import database.sql
|
||||
|
||||
fun main() {
|
||||
val db, err = sql.Open("postgres", "postgres://localhost/postgres?sslmode=disable")
|
||||
err = nil
|
||||
}
|
||||
`
|
||||
|
||||
prog, err := Parse(src)
|
||||
if err != nil {
|
||||
t.Fatalf("parse failed: %v", err)
|
||||
}
|
||||
_, err = GenerateGo(prog)
|
||||
if err == nil {
|
||||
t.Fatal("expected multi-val reassignment error")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "cannot reassign immutable name err") {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoAllowsVarReassignment(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
||||
fun main() {
|
||||
var count = 0
|
||||
count = 1
|
||||
count += 2
|
||||
println(count)
|
||||
}
|
||||
`
|
||||
|
||||
prog, err := Parse(src)
|
||||
if err != nil {
|
||||
t.Fatalf("parse failed: %v", err)
|
||||
}
|
||||
out, err := GenerateGo(prog)
|
||||
if err != nil {
|
||||
t.Fatalf("go generation failed: %v", err)
|
||||
}
|
||||
code := string(out)
|
||||
for _, want := range []string{
|
||||
`count := 0`,
|
||||
`count = 1`,
|
||||
`count += 2`,
|
||||
} {
|
||||
if !strings.Contains(code, want) {
|
||||
t.Fatalf("generated Go missing %q:\n%s", want, code)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoRejectsReassignmentToImmutableClassField(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
||||
class Counter(val count: Int, var total: Int) {
|
||||
fun freeze() {
|
||||
count = 1
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
prog, err := Parse(src)
|
||||
if err != nil {
|
||||
t.Fatalf("parse failed: %v", err)
|
||||
}
|
||||
_, err = GenerateGo(prog)
|
||||
if err == nil {
|
||||
t.Fatal("expected immutable class field reassignment error")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "cannot reassign immutable name count") {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoAllowsReassignmentToMutableClassField(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
||||
class Counter(var count: Int) {
|
||||
fun inc() {
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
prog, err := Parse(src)
|
||||
if err != nil {
|
||||
t.Fatalf("parse failed: %v", err)
|
||||
}
|
||||
out, err := GenerateGo(prog)
|
||||
if err != nil {
|
||||
t.Fatalf("go generation failed: %v", err)
|
||||
}
|
||||
if !strings.Contains(string(out), `self.count += 1`) {
|
||||
t.Fatalf("generated Go missing mutable field assignment:\n%s", string(out))
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateGoWorkerSyncPanicPropagationScaffolding(t *testing.T) {
|
||||
src := `
|
||||
package demo
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue