You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
box-o-sand/gotime/smplt/smplt_test.go

271 lines
6.7 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

package smplt_test
import (
"bytes"
"fmt"
"go/parser"
"go/token"
"mime"
"os"
"path"
"testing"
"time"
. "github.com/meatballhat/box-o-sand/gotime/smplt"
)
const (
BASIC_RENDERED_TXT_SIMPLATE = `
import (
"time"
)
type Dance struct {
Who string
When time.Time
}
ctx["D"] = &Dance{
Who: "Everybody",
When: time.Now(),
}
{{.D.Who}} Dance {{.D.When}}!
`
BASIC_STATIC_TXT_SIMPLATE = `
Everybody Dance Now!
`
BASIC_JSON_SIMPLATE = `
import (
"time"
)
type Dance struct {
Who string
When time.Time
}
ctx["D"] = &Dance{
Who: "Everybody",
When: time.Now(),
response.SetBody(ctx["D"])
}
`
BASIC_NEGOTIATED_SIMPLATE = `
import (
"time"
)
type Dance struct {
Who string
When time.Time
}
ctx["D"] = &Dance{
Who: "Everybody",
When: time.Now(),
}
text/plain
{{.D.Who}} Dance {{.D.When}}!
application/json
{"who":"{{.D.Who}}","when":"{{.D.When}}"}
`
)
var (
tmpdir = path.Join(os.TempDir(),
fmt.Sprintf("smplt_test-%d", time.Now().UTC().UnixNano()))
)
func mkTmpDir() {
err := os.MkdirAll(tmpdir, os.ModeDir|os.ModePerm)
if err != nil {
panic(err)
}
}
func rmTmpDir() {
err := os.RemoveAll(tmpdir)
if err != nil {
panic(err)
}
}
func TestSimplateKnowsItsFilename(t *testing.T) {
s := SimplateFromString("hasty-decisions.txt", "herpherpderpherp")
if s.Filename != "hasty-decisions.txt" {
t.Errorf("Simplate filename incorrectly assigned as %s instead of %s",
s.Filename, "hasty-decisions.txt")
}
}
func TestSimplateKnowsItsContentType(t *testing.T) {
s := SimplateFromString("hasty-decisions.js", "function herp() { return 'derp'; }")
expected := mime.TypeByExtension(".js")
if s.ContentType != expected {
t.Errorf("Simplate content type incorrectly assigned as %s instead of %s",
s.ContentType, expected)
}
}
func TestStaticSimplateKnowsItsOutputName(t *testing.T) {
s := SimplateFromString("nothing.txt", "foo\nham\n")
if s.OutputName() != "nothing.txt" {
t.Errorf("Static simplate output name is wrong!: %v", s.OutputName())
}
}
func TestRenderedSimplateKnowsItsOutputName(t *testing.T) {
s := SimplateFromString("flip/dippy slippy/snork.d/basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
if s.OutputName() != "flip-SLASH-dippy-SPACE-slippy-SLASH-snork-DOT-d-SLASH-basic-rendered-DOT-txt.go" {
t.Errorf("Rendered simplate output name is wrong!: %v", s.OutputName())
}
}
func TestDetectsRenderedSimplate(t *testing.T) {
s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
if s.Type != SIMPLATE_TYPE_RENDERED {
t.Errorf("Simplate detected as %s instead of %s", s.Type, SIMPLATE_TYPE_RENDERED)
}
}
func TestDetectsStaticSimplate(t *testing.T) {
s := SimplateFromString("basic-static.txt", BASIC_STATIC_TXT_SIMPLATE)
if s.Type != SIMPLATE_TYPE_STATIC {
t.Errorf("Simplate detected as %s instead of %s", s.Type, SIMPLATE_TYPE_STATIC)
}
}
func TestDetectsJSONSimplates(t *testing.T) {
s := SimplateFromString("basic.json", BASIC_JSON_SIMPLATE)
if s.Type != SIMPLATE_TYPE_JSON {
t.Errorf("Simplate detected as %s instead of %s", s.Type, SIMPLATE_TYPE_JSON)
}
}
func TestDetectsNegotiatedSimplates(t *testing.T) {
s := SimplateFromString("hork", BASIC_NEGOTIATED_SIMPLATE)
if s.Type != SIMPLATE_TYPE_NEGOTIATED {
t.Errorf("Simplate detected as %s instead of %s",
s.Type, SIMPLATE_TYPE_NEGOTIATED)
}
}
func TestAssignsNoGoPagesToStaticSimplates(t *testing.T) {
s := SimplateFromString("basic-static.txt", BASIC_STATIC_TXT_SIMPLATE)
if s.InitPage != nil {
t.Errorf("Static simplate had init page assigned!: %v", s.InitPage)
}
if len(s.LogicPages) > 0 {
t.Errorf("Static simplate had logic pages assigned!: %v", s.LogicPages)
}
}
func TestAssignsAnInitPageToRenderedSimplates(t *testing.T) {
s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
if s.InitPage == nil {
t.Errorf("Rendered simplate had no init page assigned!: %v", s.InitPage)
}
}
func TestAssignsOneLogicPageToRenderedSimplates(t *testing.T) {
s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
if len(s.LogicPages) != 1 {
t.Errorf("Rendered simplate unexpected number "+
"of logic pages assigned!: %v", len(s.LogicPages))
}
}
func TestAssignsOneTemplatePageToRenderedSimplates(t *testing.T) {
s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
if s.TemplatePage == nil {
t.Errorf("Rendered simplate had no template page assigned!: %v", s.TemplatePage)
}
}
func TestAssignsAnInitPageToJSONSimplates(t *testing.T) {
s := SimplateFromString("basic.json", BASIC_JSON_SIMPLATE)
if s.InitPage == nil {
t.Errorf("JSON simplate had no init page assigned!: %v", s.InitPage)
}
}
func TestAssignsOneLogicPageToJSONSimplates(t *testing.T) {
s := SimplateFromString("basic.json", BASIC_JSON_SIMPLATE)
if len(s.LogicPages) != 1 {
t.Errorf("Rendered simplate unexpected number "+
"of logic pages assigned!: %v", len(s.LogicPages))
}
}
func TestAssignsNoTemplatePageToJSONSimplates(t *testing.T) {
s := SimplateFromString("basic.json", BASIC_JSON_SIMPLATE)
if s.TemplatePage != nil {
t.Errorf("JSON simplate had a template page assigned!: %v", s.TemplatePage)
}
}
func TestAssignsAnInitPageToNegotiatedSimplates(t *testing.T) {
s := SimplateFromString("basic-negotiated.txt", BASIC_NEGOTIATED_SIMPLATE)
if s.InitPage == nil {
t.Errorf("Negotiated simplate had no init page assigned!: %v", s.InitPage)
}
}
func TestAssignsAtLeastOneLogicPageToNegotiatedSimplates(t *testing.T) {
s := SimplateFromString("basic-negotiated.txt", BASIC_NEGOTIATED_SIMPLATE)
if len(s.LogicPages) < 1 {
t.Errorf("Negotiated simplate unexpected number "+
"of logic pages assigned!: %v", len(s.LogicPages))
}
}
func TestAssignsNoTemplatePageToNegotiatedSimplates(t *testing.T) {
s := SimplateFromString("basic-negotiated.txt", BASIC_NEGOTIATED_SIMPLATE)
if s.TemplatePage != nil {
t.Errorf("Negotiated simplate had a template page assigned!: %v", s.TemplatePage)
}
}
func TestRenderedSimplateCanExecuteToWriter(t *testing.T) {
s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
var out bytes.Buffer
err := s.Execute(&out)
if err != nil {
t.Error(err)
}
}
func TestRenderedSimplateOutputIsValidGoSource(t *testing.T) {
mkTmpDir()
if len(os.Getenv("SMPLT_TEST_NOCLEANUP")) > 0 {
fmt.Println("tmpdir =", tmpdir)
} else {
defer rmTmpDir()
}
s := SimplateFromString("basic-rendered.txt", BASIC_RENDERED_TXT_SIMPLATE)
outfile_name := path.Join(tmpdir, s.OutputName())
outf, err := os.Create(outfile_name)
if err != nil {
t.Error(err)
return
}
s.Execute(outf)
err = outf.Close()
if err != nil {
t.Error(err)
}
fset := token.NewFileSet()
_, err = parser.ParseFile(fset, outfile_name, nil, parser.DeclarationErrors)
if err != nil {
t.Error(err)
return
}
}