blob: aab7e5fe38429a9745fd7f3d8cd43149258e1e3a [file] [log] [blame]
package main
import (
"bufio"
"bytes"
"strings"
"testing"
"unicode"
bpparser "github.com/google/blueprint/parser"
)
var valueTestCases = []struct {
blueprint string
expected string
}{
{
blueprint: `test = false`,
expected: `false`,
},
{
blueprint: `test = Variable`,
expected: `$(Variable)`,
},
{
blueprint: `test = "string"`,
expected: `string`,
},
{
blueprint: `test = ["a", "b"]`,
expected: `\
a \
b`,
},
{
blueprint: `test = Var + "b"`,
expected: `$(Var)b`,
},
{
blueprint: `test = ["a"] + ["b"]`,
expected: `\
a\
b`,
},
}
func TestValueToString(t *testing.T) {
for _, testCase := range valueTestCases {
blueprint, errs := bpparser.Parse("", strings.NewReader(testCase.blueprint), nil)
if len(errs) > 0 {
t.Errorf("Failed to read blueprint: %q", errs)
}
str := valueToString(blueprint.Defs[0].(*bpparser.Assignment).Value)
expect(t, testCase.blueprint, testCase.expected, str)
}
}
var moduleTestCases = []struct {
blueprint string
androidmk string
}{
// Target-only
{
blueprint: `cc_library_shared { name: "test", }`,
androidmk: `include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_SHARED_LIBRARY)`,
},
// Host-only
{
blueprint: `cc_library_host_shared { name: "test", }`,
androidmk: `include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_HOST_SHARED_LIBRARY)`,
},
// Target and Host
{
blueprint: `cc_library_shared { name: "test", host_supported: true, }`,
androidmk: `include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_HOST_SHARED_LIBRARY)`,
},
// Static and Shared
{
blueprint: `cc_library { name: "test", }`,
androidmk: `include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := test
include $(BUILD_STATIC_LIBRARY)`,
},
}
func TestModules(t *testing.T) {
for _, testCase := range moduleTestCases {
blueprint, errs := bpparser.Parse("", strings.NewReader(testCase.blueprint), nil)
if len(errs) > 0 {
t.Errorf("Failed to read blueprint: %q", errs)
}
buf := &bytes.Buffer{}
writer := &androidMkWriter{
blueprint: blueprint,
path: "",
mapScope: make(map[string][]*bpparser.Property),
Writer: bufio.NewWriter(buf),
}
module := blueprint.Defs[0].(*bpparser.Module)
writer.handleModule(module)
writer.Flush()
expect(t, testCase.blueprint, testCase.androidmk, buf.String())
}
}
// Trim left whitespace, and any trailing newlines. Leave inner blank lines and
// right whitespace so that we can still check line continuations are correct
func trim(str string) string {
var list []string
for _, s := range strings.Split(str, "\n") {
list = append(list, strings.TrimLeftFunc(s, unicode.IsSpace))
}
return strings.TrimRight(strings.Join(list, "\n"), "\n")
}
func expect(t *testing.T, testCase string, expected string, out string) {
expected = trim(expected)
out = trim(out)
if expected != out {
sep := " "
if strings.Index(expected, "\n") != -1 || strings.Index(out, "\n") != -1 {
sep = "\n"
}
t.Errorf("test case: %s", testCase)
t.Errorf("unexpected difference:")
t.Errorf(" expected:%s%s", sep, expected)
t.Errorf(" got:%s%s", sep, out)
}
}