test.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package test
  2. import (
  3. "testing"
  4. "os"
  5. "io"
  6. "fmt"
  7. "bytes"
  8. "errors"
  9. "strconv"
  10. "path/filepath"
  11. "kumachan/standalone/rx"
  12. "kumachan/standalone/util/fatal"
  13. "kumachan/interpreter"
  14. "kumachan/interpreter/runtime/vm"
  15. "kumachan/interpreter/runtime/lib/env"
  16. )
  17. const failedToCompile = "failed to compile"
  18. func getTestDirPath(t *testing.T, kind string) string {
  19. var exe_path, err = os.Executable()
  20. if err != nil { t.Fatal(err) }
  21. var project_path = filepath.Dir(filepath.Dir(exe_path))
  22. return filepath.Join(project_path, "test", kind)
  23. }
  24. func bufferFiles(in *bytes.Buffer, out *bytes.Buffer) (*os.File, *os.File, func()) {
  25. var sem = make(chan struct{}, 2)
  26. var stdin, stdin_write, err1 = os.Pipe()
  27. if err1 != nil { panic(err1) }
  28. var stdout_read, stdout, err2 = os.Pipe()
  29. if err2 != nil { panic(err2) }
  30. sem <- struct{}{}
  31. go (func() {
  32. _, err := io.Copy(stdin_write, in)
  33. if err != nil { panic(err) }
  34. err = stdin_write.Close()
  35. if err != nil { panic(err) }
  36. <- sem
  37. })()
  38. sem <- struct{}{}
  39. go (func() {
  40. _, err := io.Copy(out, stdout_read)
  41. if err != nil { panic(err) }
  42. err = stdout_read.Close()
  43. if err != nil { panic(err) }
  44. <- sem
  45. })()
  46. return stdin, stdout, func() {
  47. err := stdin.Close()
  48. if err != nil { panic(err) }
  49. err = stdout.Close()
  50. if err != nil { panic(err) }
  51. sem <- struct{}{}
  52. sem <- struct{}{}
  53. }
  54. }
  55. func expectStdIO(t *testing.T, path string, in string, expected_out string) {
  56. var p, err = interpreter.Compile(path)
  57. if err != nil {
  58. fatal.Log(err, failedToCompile, os.Stderr)
  59. t.Fatal(failedToCompile)
  60. }
  61. var in_buf = bytes.NewBufferString(in)
  62. var out_buf = new(bytes.Buffer)
  63. var stdin, stdout, std_close = bufferFiles(in_buf, out_buf)
  64. var test_env = env.NewDefaultEnvironment(nil)
  65. test_env.Stdin = rx.FileFrom(stdin)
  66. test_env.Stdout = rx.FileFrom(stdout)
  67. var options = &vm.Options { Environment: test_env }
  68. (func() {
  69. defer func() {
  70. var err = recover()
  71. if err != nil {
  72. t.Fatal(err)
  73. }
  74. }()
  75. interpreter.Run(p, options)
  76. })()
  77. std_close()
  78. var actual_out = out_buf.String()
  79. if actual_out != expected_out {
  80. t.Fatal(errors.New(fmt.Sprintf(
  81. "stdout not matching" + "\n" +
  82. "expected result:" + "\n" +
  83. "%s" +"\n" +
  84. "actual result:" + "\n" +
  85. "%s" + "\n",
  86. strconv.Quote(expected_out), strconv.Quote(actual_out),
  87. )))
  88. }
  89. }