neoneo-go/pkg/compiler/pointer_test.go

69 lines
7.9 KiB
Go
Raw Permalink Normal View History

package compiler_test
import (
"math/big"
"testing"
)
func TestAddressOfLiteral(t *testing.T) {
src := `package foo
type Foo struct { A int }
func Main() int {
f := &Foo{}
setA(f, 3)
return f.A
}
func setA(s *Foo, a int) { s.A = a }`
eval(t, src, big.NewInt(3))
}
func TestPointerDereference(t *testing.T) {
src := `package foo
type Foo struct { A int }
func Main() int {
f := &Foo{A: 4}
setA(*f, 3)
return f.A
}
func setA(s Foo, a int) { s.A = a }`
eval(t, src, big.NewInt(4))
}
func TestStructArgCopy(t *testing.T) {
t.Run("Simple", func(t *testing.T) {
src := `package foo
type Foo struct { A int }
func Main() int {
f := Foo{A: 4}
setA(f, 3)
return f.A
}
func setA(s Foo, a int) { s.A = a }`
eval(t, src, big.NewInt(4))
})
t.Run("StructField", func(t *testing.T) {
src := `package foo
type Bar struct { A int }
type Foo struct { B Bar }
func Main() int {
f := Foo{B: Bar{A: 4}}
setA(f, 3)
return f.B.A
}
func setA(s Foo, a int) { s.B.A = a }`
eval(t, src, big.NewInt(4))
})
t.Run("StructPointerField", func(t *testing.T) {
src := `package foo
type Bar struct { A int }
type Foo struct { B *Bar }
func Main() int {
f := Foo{B: &Bar{A: 4}}
setA(f, 3)
return f.B.A
}
func setA(s Foo, a int) { s.B.A = a }`
eval(t, src, big.NewInt(3))
})
}