platform_build_blueprint/blueprint/ninja_writer_test.go
Jamie Gennis 1bc967ed43 Initial Blueprint commit.
Blueprint is a build system component that reads Blueprints files defining
modules to be built, and generates a Ninja build manifest that can be used to
perform all the build actions.  It does not dictate or implement much build
policy itself, but rather provides a framework to ease the process of defining
build logic in Go.

The "blueprint" and "blueprint/parser" Go packages contain the functionality
for reading Blueprint files and invoking build logic functions defined in other
Go packages.

The "blueprint/bootstrap" Go package contains just enough build logic to build
a binary that includes Blueprint and any pure-Go (i.e. no cgo) build logic
defined in external Go packages.  This can be used to create a minimal Ninja
file that's capable of bootstrapping a Blueprint-based build system from
source.

The "blueprint/bootstrap/minibp" Go package contains code for a minimal binary
that includes the build logic defined in the "blueprint/bootstrap" package.
This binary can then create the Ninja file for the bootstrapping process.

Change-Id: I8d8390042372a72d225785cda738525001b009f1
2014-06-04 14:23:32 -07:00

105 lines
2 KiB
Go

package blueprint
import (
"bytes"
"testing"
)
func ck(err error) {
if err != nil {
panic(err)
}
}
var ninjaWriterTestCases = []struct {
input func(w *ninjaWriter)
output string
}{
{
input: func(w *ninjaWriter) {
ck(w.Comment("foo"))
},
output: "# foo\n",
},
{
input: func(w *ninjaWriter) {
ck(w.Pool("foo"))
},
output: "pool foo\n",
},
{
input: func(w *ninjaWriter) {
ck(w.Rule("foo"))
},
output: "rule foo\n",
},
{
input: func(w *ninjaWriter) {
ck(w.Build("foo", []string{"o1", "o2"}, []string{"e1", "e2"},
[]string{"i1", "i2"}, []string{"oo1", "oo2"}))
},
output: "build o1 o2: foo e1 e2 | i1 i2 || oo1 oo2\n",
},
{
input: func(w *ninjaWriter) {
ck(w.Default("foo"))
},
output: "default foo\n",
},
{
input: func(w *ninjaWriter) {
ck(w.Assign("foo", "bar"))
},
output: "foo = bar\n",
},
{
input: func(w *ninjaWriter) {
ck(w.ScopedAssign("foo", "bar"))
},
output: " foo = bar\n",
},
{
input: func(w *ninjaWriter) {
ck(w.BlankLine())
},
output: "\n",
},
{
input: func(w *ninjaWriter) {
ck(w.Pool("p"))
ck(w.ScopedAssign("depth", "3"))
ck(w.BlankLine())
ck(w.Comment("here comes a rule"))
ck(w.Rule("r"))
ck(w.ScopedAssign("command", "echo out: $out in: $in _arg: $_arg"))
ck(w.ScopedAssign("pool", "p"))
ck(w.BlankLine())
ck(w.Build("r", []string{"foo.o"}, []string{"foo.in"}, nil, nil))
ck(w.ScopedAssign("_arg", "arg value"))
},
output: `pool p
depth = 3
# here comes a rule
rule r
command = echo out: $out in: $in _arg: $_arg
pool = p
build foo.o: r foo.in
_arg = arg value
`,
},
}
func TestNinjaWriter(t *testing.T) {
for i, testCase := range ninjaWriterTestCases {
buf := bytes.NewBuffer(nil)
w := newNinjaWriter(buf)
testCase.input(w)
if buf.String() != testCase.output {
t.Errorf("incorrect output for test case %d", i)
t.Errorf(" expected: %q", testCase.output)
t.Errorf(" got: %q", buf.String())
}
}
}