go-ph7/ph7_test.go

107 lines
2.1 KiB
Go

package ph7_test
import (
"bytes"
"errors"
"fmt"
"testing"
ph7 "git.codemonkeysoftware.net/b/go-ph7"
)
func mustSucceed(t *testing.T, err error) {
t.Helper()
if err != nil {
t.Fatal(err.Error())
}
}
func mustFail(t *testing.T, err error) {
t.Helper()
if err == nil {
t.Fatal("expected error, got nil")
}
}
func mustSucceedF(t *testing.T, f func() error) {
t.Helper()
err := f()
if err != nil {
t.Fatal(err.Error())
}
}
func TestCore(t *testing.T) {
engine, err := ph7.NewEngine()
mustSucceed(t, err)
defer mustSucceedF(t, engine.Close)
vm, err := engine.Compile([]byte("<?php echo 'Hello world!'; ?>"), false)
mustSucceed(t, err)
defer mustSucceedF(t, vm.Close)
mustSucceed(t, vm.Exec())
output, err := vm.ExtractOutput()
mustSucceed(t, err)
if output != "Hello world!" {
t.Fatalf("unexpected output: %s", output)
}
mustSucceed(t, vm.Reset())
mustSucceed(t, vm.Exec())
output, err = vm.ExtractOutput()
mustSucceed(t, err)
if output != "Hello world!" {
t.Fatalf("unexpected output: %s", output)
}
}
func TestCompileError(t *testing.T) {
engine, err := ph7.NewEngine()
mustSucceed(t, err)
defer mustSucceedF(t, engine.Close)
_, err = engine.Compile([]byte("<?php 1234 echo 'Hello world!'; ?>"), false)
mustFail(t, err)
var target ph7.CompileError
isCompileError := errors.As(err, &target)
if !isCompileError || target.Msg == "" {
t.Fatalf("expected compile error, got %#v", err)
}
}
func TestOutputWriter(t *testing.T) {
const source = `<?php
for ($x = 0; $x <= 1000; $x++) {
echo $x;
}
?>`
var expected bytes.Buffer
for i := 0; i <= 1000; i++ {
_, err := fmt.Fprint(&expected, i)
mustSucceed(t, err)
}
engine, err := ph7.NewEngine()
mustSucceed(t, err)
defer mustSucceedF(t, engine.Close)
vm, err := engine.Compile([]byte(source), false)
mustSucceed(t, err)
defer vm.Close()
var actual bytes.Buffer
err = vm.SetOutputWriter(&actual)
mustSucceed(t, err)
mustSucceed(t, vm.Exec())
if !bytes.Equal(expected.Bytes(), actual.Bytes()) {
t.Fatalf("expected %s, got %s", expected.String(), actual.String())
}
}
// TODO Test failing writer, including vm.OutputWriteError
// TODO Test setting writer twice