fspl/generator/multiunit_test.go

170 lines
4.7 KiB
Go

package generator
import "testing"
func TestUnitTwo (test *testing.T) {
testUnits (test,
`%"E80Pxr3rNdulEDOmHs9Hsg==::X" = type i64
define %"E80Pxr3rNdulEDOmHs9Hsg==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
0:
ret i64 5
}
`,
`[main]:something::X = 5`,
"something.fspl",
`+ X:Int`,
)}
func TestUnitAssignRestricted (test *testing.T) {
testUnits (test,
`%"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt" = type i64
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
0:
%1 = alloca %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt"
%2 = alloca %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt"
%3 = load %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt", ptr %2
store %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt" %3, ptr %1
ret void
}
`,
`[main] = {
x:other::RestrictedInt
y:other::RestrictedInt
x = y
}`,
"other.fspl",
`# RestrictedInt:Int`,
)}
func TestNestedUnitTypedef (test *testing.T) {
testUnits (test,
`%"kOsrvvRIOh2nYGTmlfGyKQ==::X" = type i64
%"qnTuCId6O/ihTdVz5Ln6WQ==::X" = type %"kOsrvvRIOh2nYGTmlfGyKQ==::X"
define %"qnTuCId6O/ihTdVz5Ln6WQ==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
0:
ret i64 5
}
`,
`[main]:layer1::X = 5`,
"layer0.fspl",
`+ X:Int`,
"layer1.fspl",
`+ X:layer0::X`,
)}
func TestUnitInterfaceSatisfaction (test *testing.T) {
testUnits (test,
`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"qsUY87+PPGG/YPYMcnGU/g==::FileDescriptor" = type i64
%"1cqXRNyHN06gi9QQb4GCsg==::File" = type %"qsUY87+PPGG/YPYMcnGU/g==::FileDescriptor"
%"1cqXRNyHN06gi9QQb4GCsg==::Writer" = type { ptr, ptr }
%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" = type i8
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(%"qsUY87+PPGG/YPYMcnGU/g==::FileDescriptor" %file, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count)
define i32 @main() {
0:
%1 = alloca %"1cqXRNyHN06gi9QQb4GCsg==::File"
store i64 1, ptr %1
%2 = alloca %"1cqXRNyHN06gi9QQb4GCsg==::Writer"
%3 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2, i32 0, i32 0
store ptr %1, ptr %3
%4 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2, i32 0, i32 1
store ptr @"1cqXRNyHN06gi9QQb4GCsg==::File.write", ptr %4
%5 = load %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2
call void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %5)
ret i32 0
}
define void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %writer) {
0:
%1 = alloca %"1cqXRNyHN06gi9QQb4GCsg==::Writer"
store %"1cqXRNyHN06gi9QQb4GCsg==::Writer" %writer, ptr %1
%2 = alloca { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
%3 = alloca [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"]
%4 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"], ptr %3, i32 0, i32 0
store i8 104, ptr %4
%5 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"], ptr %3, i32 0, i32 1
store i8 105, ptr %5
%6 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"], ptr %3, i32 0, i32 2
store i8 10, ptr %6
%7 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %2, i32 0, i32 0
store ptr %3, ptr %7
%8 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %2, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 3, ptr %8
%9 = load { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %2
%10 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %1, i32 0, i32 1
%11 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %1, i32 0, i32 0
%12 = load ptr, ptr %11
%13 = load ptr, ptr %10
%14 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %13(ptr %12, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %9)
ret void
}
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"1cqXRNyHN06gi9QQb4GCsg==::File.write"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer)
`,
`[sayHello writer:io::Writer] = writer.[write 'hi\n']
[main]: I32 'main' = {
stdout:io::File = 1
[sayHello stdout]
0
}`,
"cstdio.fspl",
`+ FileDescriptor: Int
+ [write file:FileDescriptor buffer:*Byte count:Index]: Index 'write'`,
"io.fspl",
`+ Writer: (& [write buffer:*:Byte]: Index)
+ File: cstdio::FileDescriptor
+ File.[write buffer:*:Byte]:Index =
cstdio::[write
[~cstdio::FileDescriptor [.this]]
[~*Byte buffer] [#buffer]]`,
)}
func TestUnitMethod (test *testing.T) {
testUnits (test,
`%"9U3Q1r5tPJSXoVNdBSzCow==::T" = type i64
define void @main() {
0:
%1 = alloca %"9U3Q1r5tPJSXoVNdBSzCow==::T"
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %1)
ret void
}
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %this)
`,
`[main] 'main' = {
x:def::T
x.[method]
}`,
"def.fspl",
`+ T:Int
+ T.[method] = { }`,
)}
func TestUnitMethodPtr (test *testing.T) {
testUnits (test,
`define void @main() {
0:
%1 = alloca ptr
%2 = load ptr, ptr %1
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %2)
ret void
}
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %this)
`,
`[main] 'main' = {
x:*def::T
x.[method]
}`,
"def.fspl",
`+ T:Int
+ T.[method] = { }`,
)}