// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package serialization

import (
	"bytes"
	"compress/gzip"
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"mojo/public/go/bindings"
	"mojom/mojom_parser/generated/mojom_files"
	"mojom/mojom_parser/generated/mojom_types"
	"mojom/mojom_parser/mojom"
	"mojom/mojom_parser/parser"
	"reflect"
	"testing"
	myfmt "third_party/golang/src/fmt"
)

// singleFileTestCase stores the data for one serialization test case
// in which only a single file is added to the file graph.
type singleFileTestCase struct {
	fileName             string
	mojomContents        string
	lineAndcolumnNumbers bool
	expectedFile         *mojom_files.MojomFile
	expectedGraph        *mojom_files.MojomFileGraph
}

// singleFileTest contains a series of singleFileTestCase and a current
// testCaseNum.
type singleFileTest struct {
	cases       []singleFileTestCase
	testCaseNum int
}

// expectedFile() returns the expectedFile of the current test case.
func (t *singleFileTest) expectedFile() *mojom_files.MojomFile {
	return t.cases[t.testCaseNum].expectedFile
}

// expectedGraph() returns the expectedGraph of the current test case.
func (t *singleFileTest) expectedGraph() *mojom_files.MojomFileGraph {
	return t.cases[t.testCaseNum].expectedGraph
}

// fileName() returns the fileName of the current test case
func (t *singleFileTest) fileName() string {
	return t.cases[t.testCaseNum].fileName
}

// addTestCase() should be invoked at the start of a case in
// TestSingleFileSerialization.
func (test *singleFileTest) addTestCase(moduleNameSpace, contents string) {
	fileName := fmt.Sprintf("file%d", test.testCaseNum)
	test.cases = append(test.cases, singleFileTestCase{fileName, contents, false,
		new(mojom_files.MojomFile), new(mojom_files.MojomFileGraph)})

	test.expectedFile().FileName = fileName
	test.expectedFile().SpecifiedFileName = stringPointer(fileName)
	test.expectedFile().ModuleNamespace = &moduleNameSpace

	test.expectedGraph().ResolvedTypes = make(map[string]mojom_types.UserDefinedType)
	test.expectedGraph().ResolvedValues = make(map[string]mojom_types.UserDefinedValue)
}

// endTestCase() should be invoked at the end of a case in
// TestSingleFileSerialization.
func (test *singleFileTest) endTestCase() {
	test.expectedGraph().Files = make(map[string]mojom_files.MojomFile)
	test.expectedGraph().Files[test.fileName()] = *test.expectedFile()
	test.testCaseNum += 1
}

// newShortDeclDataO constructs a new DeclarationData with the given data.
func (test *singleFileTest) newShortDeclData(shortName string) *mojom_types.DeclarationData {
	declData := test.newContainedDeclData(shortName, "", nil)
	declData.FullIdentifier = nil
	return declData
}

// newShortDeclDataO constructs a new DeclarationData with the given data.
func (test *singleFileTest) newShortDeclDataO(declarationOrder, declaredOrdinal int32, shortName string) *mojom_types.DeclarationData {
	declData := test.newContainedDeclDataA(declarationOrder, declaredOrdinal, shortName, "", nil, nil)
	declData.FullIdentifier = nil
	return declData
}

// newDeclData constructs a new DeclarationData with the given data.
func (test *singleFileTest) newDeclData(shortName, fullIdentifier string) *mojom_types.DeclarationData {
	return test.newContainedDeclData(shortName, fullIdentifier, nil)
}

// newDeclData constructs a new DeclarationData with the given data.
func (test *singleFileTest) newDeclDataO(declarationOrder, declaredOrdinal int32, shortName, fullIdentifier string) *mojom_types.DeclarationData {
	return test.newContainedDeclDataA(declarationOrder, declaredOrdinal, shortName, fullIdentifier, nil, nil)
}

// newDeclDataA constructs a new DeclarationData with the given data, including attributes.
func (test *singleFileTest) newDeclDataA(shortName, fullIdentifier string,
	attributes *[]mojom_types.Attribute) *mojom_types.DeclarationData {
	return test.newContainedDeclDataA(-1, -1, shortName, fullIdentifier, nil, attributes)
}

// newShortDeclDataA constructs a new DeclarationData with the given data, including attributes.
func (test *singleFileTest) newShortDeclDataA(shortName string,
	attributes *[]mojom_types.Attribute) *mojom_types.DeclarationData {
	declData := test.newContainedDeclDataA(-1, -1, shortName, "", nil, attributes)
	declData.FullIdentifier = nil
	return declData
}

// newShortDeclDataA constructs a new DeclarationData with the given data, including attributes.
func (test *singleFileTest) newShortDeclDataAO(declarationOrder, declaredOrdinal int32, shortName string,
	attributes *[]mojom_types.Attribute) *mojom_types.DeclarationData {
	declData := test.newContainedDeclDataA(declarationOrder, declaredOrdinal, shortName, "", nil, attributes)
	declData.FullIdentifier = nil
	return declData
}

// newContainedDeclData constructs a new DeclarationData with the given data.
func (test *singleFileTest) newContainedDeclData(shortName, fullIdentifier string, containerTypeKey *string) *mojom_types.DeclarationData {
	return test.newContainedDeclDataA(-1, -1, shortName, fullIdentifier, containerTypeKey, nil)
}

// newContainedDeclDataA constructs a new DeclarationData with the given data, including attributes.
func (test *singleFileTest) newContainedDeclDataA(declarationOrder, declaredOrdinal int32, shortName, fullIdentifier string,
	containerTypeKey *string, attributes *[]mojom_types.Attribute) *mojom_types.DeclarationData {
	return newContainedDeclDataA(declarationOrder, declaredOrdinal, test.fileName(), shortName, fullIdentifier, containerTypeKey, attributes)
}

// newDeclData constructs a new DeclarationData with the given data.
func newDeclData(fileName, shortName, fullIdentifier string) *mojom_types.DeclarationData {
	return newContainedDeclData(fileName, shortName, fullIdentifier, nil)
}

// newDeclData constructs a new DeclarationData with the given data.
func newDeclDataO(declarationOrder, declaredOrdinal int32, fileName, shortName, fullIdentifier string) *mojom_types.DeclarationData {
	return newContainedDeclDataA(declarationOrder, declaredOrdinal, fileName, shortName, fullIdentifier, nil, nil)
}

// newDeclDataA constructs a new DeclarationData with the given data, including attributes.
func newDeclDataA(fileName, shortName, fullIdentifier string,
	attributes *[]mojom_types.Attribute) *mojom_types.DeclarationData {
	return newContainedDeclDataA(-1, -1, fileName, shortName, fullIdentifier, nil, attributes)
}

// newContainedDeclData constructs a new DeclarationData with the given data.
func newContainedDeclData(fileName, shortName, fullIdentifier string, containerTypeKey *string) *mojom_types.DeclarationData {
	return newContainedDeclDataA(-1, -1, fileName, shortName, fullIdentifier, containerTypeKey, nil)
}

// newContainedDeclDataA constructs a new DeclarationData with the given data, including attributes.
func newContainedDeclDataA(declarationOrder, declaredOrdinal int32, fileName, shortName, fullIdentifier string,
	containerTypeKey *string, attributes *[]mojom_types.Attribute) *mojom_types.DeclarationData {
	var fullyQualifiedName *string
	if fullIdentifier != "" {
		fullyQualifiedName = &fullIdentifier
	}
	return &mojom_types.DeclarationData{
		Attributes:       attributes,
		ShortName:        &shortName,
		FullIdentifier:   fullyQualifiedName,
		DeclaredOrdinal:  declaredOrdinal,
		DeclarationOrder: declarationOrder,
		ContainerTypeKey: containerTypeKey,
		SourceFileInfo: &mojom_types.SourceFileInfo{
			FileName: fileName,
		}}
}

// TestSingleFileSerialization uses a series of test cases in which the text of a .mojom
// file is specified and the expected MojomFileGraph is specified using Go struct literals.
func TestSingleFileSerialization(t *testing.T) {
	test := singleFileTest{}

	////////////////////////////////////////////////////////////
	// Test Case: struct field ordinals
	////////////////////////////////////////////////////////////
	{

		contents := `
	struct Foo{
	  int32 x@2;
	  int32 y@3;
	  int32 z@0;
	  int32 w@1;
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		// ResolvedTypes

		// struct Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.

				// field z
				{
					DeclData: test.newShortDeclDataO(2, 0, "z"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
				// field w
				{
					DeclData: test.newShortDeclDataO(3, 1, "w"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
				// field x
				{
					DeclData: test.newShortDeclDataO(0, 2, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, 3, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: struct field ordinals, some implicit
	////////////////////////////////////////////////////////////
	{

		contents := `
	struct Foo{
	  int32 x@2;
	  int32 y;
	  int32 z@0;
	  int32 w;
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		// ResolvedTypes

		// struct Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.

				// field z
				{
					DeclData: test.newShortDeclDataO(2, 0, "z"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
				// field w
				{
					DeclData: test.newShortDeclDataO(3, -1, "w"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
				// field x
				{
					DeclData: test.newShortDeclDataO(0, 2, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, -1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: union field tags
	////////////////////////////////////////////////////////////
	{

		contents := `
	union Foo{
	  int32 x@21;
	  string y@32;
	  bool z@6;
	  float w@17;
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Unions = &[]string{"TYPE_KEY:Foo"}

		// ResolvedTypes

		// union Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeUnionType{mojom_types.MojomUnion{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.UnionField{
				// The fields are in tag order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.

				// field z
				{
					DeclData: test.newShortDeclDataO(2, 6, "z"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Tag:      6,
				},
				// field w
				{
					DeclData: test.newShortDeclDataO(3, 17, "w"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Float},
					Tag:      17,
				},
				// field x
				{
					DeclData: test.newShortDeclDataO(0, 21, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Tag:      21,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, 32, "y"),
					Type:     &mojom_types.TypeStringType{mojom_types.StringType{false}},
					Tag:      32,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: union field tags, some implicit
	////////////////////////////////////////////////////////////
	{

		contents := `
	union Foo{
	  int32 x@21;
	  string y;
	  bool z@6;
	  float w;
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Unions = &[]string{"TYPE_KEY:Foo"}

		// ResolvedTypes

		// union Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeUnionType{mojom_types.MojomUnion{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.UnionField{
				// The fields are in tag order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.

				// field z
				{
					DeclData: test.newShortDeclDataO(2, 6, "z"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Tag:      6,
				},
				// field w
				{
					DeclData: test.newShortDeclDataO(3, -1, "w"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Float},
					Tag:      7,
				},
				// field x
				{
					DeclData: test.newShortDeclDataO(0, 21, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Tag:      21,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, -1, "y"),
					Type:     &mojom_types.TypeStringType{mojom_types.StringType{false}},
					Tag:      22,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: array of int32
	////////////////////////////////////////////////////////////
	{

		contents := `
	struct Foo{
	  array<int32> bar1;
	  array<int32, 7> bar2;
	  array<int32>? bar3;
	  array<int32, 8>? bar4;
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		// ResolvedTypes

		// struct Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// field bar1 is not nullable and not fixed length
				{
					DeclData: test.newShortDeclDataO(0, -1, "bar1"),
					Type: &mojom_types.TypeArrayType{mojom_types.ArrayType{
						false, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
				// field bar2 is not nullable and fixed length of 7
				{
					DeclData: test.newShortDeclDataO(1, -1, "bar2"),
					Type: &mojom_types.TypeArrayType{mojom_types.ArrayType{
						false, 7, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
				// field bar3 is nullable and not fixed length
				{
					DeclData: test.newShortDeclDataO(2, -1, "bar3"),
					Type: &mojom_types.TypeArrayType{mojom_types.ArrayType{
						true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
				// field bar4 is nullable and fixed length of 8
				{
					DeclData: test.newShortDeclDataO(3, -1, "bar4"),
					Type: &mojom_types.TypeArrayType{mojom_types.ArrayType{
						true, 8, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: map string to int32
	////////////////////////////////////////////////////////////
	{

		contents := `
	struct Foo{
	  map<string,  int32>  bar1;
	  map<string?, int32>  bar2;
	  map<string,  int32>? bar3;
	  map<string?, int32>? bar4;
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		// ResolvedTypes

		// struct Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// field bar1 is non-nullable with a non-nullable key.
				{
					DeclData: test.newShortDeclDataO(0, -1, "bar1"),
					Type: &mojom_types.TypeMapType{mojom_types.MapType{
						false,
						&mojom_types.TypeStringType{mojom_types.StringType{false}},
						&mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
				// field bar2 is non-nullable with a nullable key.
				{
					DeclData: test.newShortDeclDataO(1, -1, "bar2"),
					Type: &mojom_types.TypeMapType{mojom_types.MapType{
						false,
						&mojom_types.TypeStringType{mojom_types.StringType{true}},
						&mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
				// field bar3 is nullable with a non-nullable key.
				{
					DeclData: test.newShortDeclDataO(2, -1, "bar3"),
					Type: &mojom_types.TypeMapType{mojom_types.MapType{
						true,
						&mojom_types.TypeStringType{mojom_types.StringType{false}},
						&mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
				// field bar4 is nullable with a nullable key.
				{
					DeclData: test.newShortDeclDataO(3, -1, "bar4"),
					Type: &mojom_types.TypeMapType{mojom_types.MapType{
						true,
						&mojom_types.TypeStringType{mojom_types.StringType{true}},
						&mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: enum value initializer
	////////////////////////////////////////////////////////////
	{

		contents := `
	enum Foo{
	  X0,
	  X1 = 42,
	  X2 = X1
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.TopLevelEnums = &[]string{"TYPE_KEY:Foo"}

		// Resolved Values

		// Foo.X0
		test.expectedGraph().ResolvedValues["TYPE_KEY:Foo.X0"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:    test.newDeclData("X0", "Foo.X0"),
			EnumTypeKey: "TYPE_KEY:Foo",
			IntValue:    0,
		}}

		// Foo.X1
		test.expectedGraph().ResolvedValues["TYPE_KEY:Foo.X1"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:         test.newDeclData("X1", "Foo.X1"),
			EnumTypeKey:      "TYPE_KEY:Foo",
			InitializerValue: &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueInt8Value{42}},
			IntValue:         42,
		}}

		// Foo.X2
		test.expectedGraph().ResolvedValues["TYPE_KEY:Foo.X2"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:    test.newDeclData("X2", "Foo.X2"),
			EnumTypeKey: "TYPE_KEY:Foo",
			InitializerValue: &mojom_types.ValueUserValueReference{mojom_types.UserValueReference{
				Identifier: "X1",
				ValueKey:   stringPointer("TYPE_KEY:Foo.X1"),
			}},
			IntValue: 42,
		}}

		// ResolvedTypes

		// enum Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeEnumType{mojom_types.MojomEnum{
			DeclData: test.newDeclData("Foo", "Foo"),
			Values: []mojom_types.EnumValue{
				// Note(rudominer) It is a bug that we need to copy the enum values here.
				// See https://github.com/domokit/mojo/issues/513.
				// value X1
				test.expectedGraph().ResolvedValues["TYPE_KEY:Foo.X0"].(*mojom_types.UserDefinedValueEnumValue).Value,
				// value X1
				test.expectedGraph().ResolvedValues["TYPE_KEY:Foo.X1"].(*mojom_types.UserDefinedValueEnumValue).Value,
				// value X2
				test.expectedGraph().ResolvedValues["TYPE_KEY:Foo.X2"].(*mojom_types.UserDefinedValueEnumValue).Value,
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: enum value name is shadowed by local constant declaration.
	////////////////////////////////////////////////////////////
	{

		contents := `
	enum Color{
	  RED, BLUE
	};

	struct MyStruct {
		const Color RED = BLUE;

        Color a_color = RED; // This should resolve to the local constant RED.
	};`

		test.addTestCase("", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.TopLevelEnums = &[]string{"TYPE_KEY:Color"}
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct"}

		// Resolved Values

		// Color.RED
		test.expectedGraph().ResolvedValues["TYPE_KEY:Color.RED"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:    test.newDeclData("RED", "Color.RED"),
			EnumTypeKey: "TYPE_KEY:Color",
			IntValue:    0,
		}}

		// Color.BLUE
		test.expectedGraph().ResolvedValues["TYPE_KEY:Color.BLUE"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:    test.newDeclData("BLUE", "Color.BLUE"),
			EnumTypeKey: "TYPE_KEY:Color",
			IntValue:    1,
		}}

		// MyStruct.RED
		test.expectedGraph().ResolvedValues["TYPE_KEY:MyStruct.RED"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newContainedDeclData("RED", "MyStruct.RED", stringPointer("TYPE_KEY:MyStruct")),
			Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
				false, false, stringPointer("Color"), stringPointer("TYPE_KEY:Color")}},
			Value: &mojom_types.ValueUserValueReference{
				mojom_types.UserValueReference{
					Identifier: "BLUE",
					ValueKey:   stringPointer("TYPE_KEY:Color.BLUE")}},
		}}

		// ResolvedTypes

		// enum Color
		test.expectedGraph().ResolvedTypes["TYPE_KEY:Color"] = &mojom_types.UserDefinedTypeEnumType{mojom_types.MojomEnum{
			DeclData: test.newDeclData("Color", "Color"),
			Values: []mojom_types.EnumValue{
				// Note(rudominer) It is a bug that we need to copy the enum values here.
				// See https://github.com/domokit/mojo/issues/513.
				// value RED
				test.expectedGraph().ResolvedValues["TYPE_KEY:Color.RED"].(*mojom_types.UserDefinedValueEnumValue).Value,
				// value BLUE
				test.expectedGraph().ResolvedValues["TYPE_KEY:Color.BLUE"].(*mojom_types.UserDefinedValueEnumValue).Value,
			},
		}}

		// struct MyStruct
		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: &mojom_types.DeclarationData{
				ShortName:        stringPointer("MyStruct"),
				FullIdentifier:   stringPointer("MyStruct"),
				DeclaredOrdinal:  -1,
				DeclarationOrder: -1,
				SourceFileInfo: &mojom_types.SourceFileInfo{
					FileName: test.fileName(),
				},
				ContainedDeclarations: &mojom_types.ContainedDeclarations{
					Constants: &[]string{"TYPE_KEY:MyStruct.RED"}},
			},
			Fields: []mojom_types.StructField{
				// field a_color
				{
					DeclData: test.newShortDeclDataO(0, -1, "a_color"),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, false, stringPointer("Color"), stringPointer("TYPE_KEY:Color")}},
					DefaultValue: &mojom_types.DefaultFieldValueValue{&mojom_types.ValueUserValueReference{
						mojom_types.UserValueReference{
							Identifier: "RED",
							ValueKey:   stringPointer("TYPE_KEY:MyStruct.RED")}}}, // Note this refers to MyStruct.RED and not Color.RED.
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: In-Out method parameters with the same name.
	////////////////////////////////////////////////////////////
	{

		contents := `
	module test;

	interface EchoService {
      EchoString(string? value) => (string? value);
      DelayedEchoString(string? value, int32 millis) => (string? value);
    };`

		test.addTestCase("test", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Interfaces = &[]string{"TYPE_KEY:test.EchoService"}

		// ResolvedTypes

		// interface EchoService
		test.expectedGraph().ResolvedTypes["TYPE_KEY:test.EchoService"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: test.newDeclData("EchoService", "test.EchoService"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: test.newDeclData("EchoString", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: test.newDeclData("EchoString-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: test.newDeclDataO(0, -1, "value", ""),
								Type:     &mojom_types.TypeStringType{mojom_types.StringType{true}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: test.newDeclData("EchoString-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: test.newDeclDataO(0, -1, "value", ""),
								Type:     &mojom_types.TypeStringType{mojom_types.StringType{true}},
							},
						},
					},
				},
				1: mojom_types.MojomMethod{
					DeclData: test.newDeclData("DelayedEchoString", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: test.newDeclData("DelayedEchoString-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: test.newDeclDataO(0, -1, "value", ""),
								Type:     &mojom_types.TypeStringType{mojom_types.StringType{true}},
							},
							mojom_types.StructField{
								DeclData: test.newDeclDataO(1, -1, "millis", ""),
								Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: test.newDeclData("DelayedEchoString-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: test.newDeclDataO(0, -1, "value", ""),
								Type:     &mojom_types.TypeStringType{mojom_types.StringType{true}},
							},
						},
					},
					Ordinal: 1,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Use of the ServiceName attribute
	////////////////////////////////////////////////////////////
	{

		contents := `
       module test;

       [ServiceName = "my.test.EchoService"]
       interface EchoService {
         EchoString(string? value) => (string? value);
       };`

		test.addTestCase("test", contents)

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Interfaces = &[]string{"TYPE_KEY:test.EchoService"}

		// ResolvedTypes

		// interface EchoService
		test.expectedGraph().ResolvedTypes["TYPE_KEY:test.EchoService"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData:    test.newDeclDataA("EchoService", "test.EchoService", &[]mojom_types.Attribute{{"ServiceName", &mojom_types.LiteralValueStringValue{"my.test.EchoService"}}}),
			ServiceName: stringPointer("my.test.EchoService"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: test.newDeclData("EchoString", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: test.newDeclData("EchoString-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: test.newDeclDataO(0, -1, "value", ""),
								Type:     &mojom_types.TypeStringType{mojom_types.StringType{true}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: test.newDeclData("EchoString-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: test.newDeclDataO(0, -1, "value", ""),
								Type:     &mojom_types.TypeStringType{mojom_types.StringType{true}},
							},
						},
					},
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Integer constants
	////////////////////////////////////////////////////////////
	{

		contents := `
	const uint8 xu8 = 255;
	const int8 x8 = -127;
	const uint16 xu16 = 0xFFFF;
	const int16 x16 = -0x7FFF;
	const uint32 xu32 = 4294967295;
	const int32 x32 = -2147483647;
	const uint64 xu64 = 0xFFFFFFFFFFFFFFFF;
	const int64 x64 = -0x7FFFFFFFFFFFFFFF;
	`
		test.addTestCase("", contents)

		// DeclaredMojomObjects

		test.expectedFile().DeclaredMojomObjects.TopLevelConstants = &[]string{
			"TYPE_KEY:xu8", "TYPE_KEY:x8", "TYPE_KEY:xu16", "TYPE_KEY:x16",
			"TYPE_KEY:xu32", "TYPE_KEY:x32", "TYPE_KEY:xu64", "TYPE_KEY:x64"}

		// Resolved Values

		// xu8
		test.expectedGraph().ResolvedValues["TYPE_KEY:xu8"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("xu8", "xu8"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Uint8},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueUint8Value{255}},
		}}

		// x8
		test.expectedGraph().ResolvedValues["TYPE_KEY:x8"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("x8", "x8"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueInt8Value{-127}},
		}}

		// xu16
		test.expectedGraph().ResolvedValues["TYPE_KEY:xu16"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("xu16", "xu16"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Uint16},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueUint16Value{0xFFFF}},
		}}

		// x16
		test.expectedGraph().ResolvedValues["TYPE_KEY:x16"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("x16", "x16"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int16},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueInt16Value{-0x7FFF}},
		}}

		// xu32
		test.expectedGraph().ResolvedValues["TYPE_KEY:xu32"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("xu32", "xu32"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Uint32},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueUint32Value{4294967295}},
		}}

		// x32
		test.expectedGraph().ResolvedValues["TYPE_KEY:x32"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("x32", "x32"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueInt32Value{-2147483647}},
		}}

		// xu64
		test.expectedGraph().ResolvedValues["TYPE_KEY:xu64"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("xu64", "xu64"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Uint64},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueUint64Value{0xFFFFFFFFFFFFFFFF}},
		}}

		// x64
		test.expectedGraph().ResolvedValues["TYPE_KEY:x64"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("x64", "x64"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int64},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueInt64Value{-0x7FFFFFFFFFFFFFFF}},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Builtin Floating-Point Constants
	////////////////////////////////////////////////////////////
	{

		contents := `
	const float f1 = float.INFINITY;
	const float f2 = float.NEGATIVE_INFINITY;
	const float f3 = float.NAN;
	const double d1 = double.INFINITY;
	const double d2 = double.NEGATIVE_INFINITY;
	const double d3 = double.NAN;
	`
		test.addTestCase("", contents)

		// DeclaredMojomObjects

		test.expectedFile().DeclaredMojomObjects.TopLevelConstants = &[]string{
			"TYPE_KEY:f1", "TYPE_KEY:f2", "TYPE_KEY:f3", "TYPE_KEY:d1", "TYPE_KEY:d2", "TYPE_KEY:d3"}

		// Resolved Values

		// f1
		test.expectedGraph().ResolvedValues["TYPE_KEY:f1"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("f1", "f1"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Float},
			Value:    &mojom_types.ValueBuiltinValue{mojom_types.BuiltinConstantValue_FloatInfinity},
		}}

		// f2
		test.expectedGraph().ResolvedValues["TYPE_KEY:f2"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("f2", "f2"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Float},
			Value:    &mojom_types.ValueBuiltinValue{mojom_types.BuiltinConstantValue_FloatNegativeInfinity},
		}}

		// f3
		test.expectedGraph().ResolvedValues["TYPE_KEY:f3"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("f3", "f3"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Float},
			Value:    &mojom_types.ValueBuiltinValue{mojom_types.BuiltinConstantValue_FloatNan},
		}}

		// d1
		test.expectedGraph().ResolvedValues["TYPE_KEY:d1"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("d1", "d1"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Double},
			Value:    &mojom_types.ValueBuiltinValue{mojom_types.BuiltinConstantValue_DoubleInfinity},
		}}

		// d2
		test.expectedGraph().ResolvedValues["TYPE_KEY:d2"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("d2", "d2"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Double},
			Value:    &mojom_types.ValueBuiltinValue{mojom_types.BuiltinConstantValue_DoubleNegativeInfinity},
		}}

		// d3
		test.expectedGraph().ResolvedValues["TYPE_KEY:d3"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("d3", "d3"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Double},
			Value:    &mojom_types.ValueBuiltinValue{mojom_types.BuiltinConstantValue_DoubleNan},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case
	////////////////////////////////////////////////////////////
	{

		contents := `
	[go_namespace="go.test",
	lucky=true,
	planet=EARTH]
	module mojom.test;

	import "another.file";
	import "and.another.file";

	const uint16 NUM_MAGI = 3;

	struct Foo{
		int32 x;
		[min_version=2]
		string y = "hello";
		string? z;

		enum Hats {
			TOP,
			COWBOY = NUM_MAGI,
			HARD,
		};
	};`

		test.addTestCase("mojom.test", contents)

		// Attributes
		test.expectedFile().Attributes = &[]mojom_types.Attribute{
			{"go_namespace", &mojom_types.LiteralValueStringValue{"go.test"}},
			{"lucky", &mojom_types.LiteralValueBoolValue{true}},
			{"planet", &mojom_types.LiteralValueStringValue{"EARTH"}},
		}

		// Imports
		test.expectedFile().Imports = &[]string{
			"another.file.canonical", "and.another.file.canonical",
		}

		// DeclaredMojomObjects
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:mojom.test.Foo"}
		test.expectedFile().DeclaredMojomObjects.TopLevelConstants = &[]string{"TYPE_KEY:mojom.test.NUM_MAGI"}

		// Resolved Values

		// NUM_MAGI
		test.expectedGraph().ResolvedValues["TYPE_KEY:mojom.test.NUM_MAGI"] = &mojom_types.UserDefinedValueDeclaredConstant{mojom_types.DeclaredConstant{
			DeclData: *test.newDeclData("NUM_MAGI", "mojom.test.NUM_MAGI"),
			Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Uint16},
			Value:    &mojom_types.ValueLiteralValue{&mojom_types.LiteralValueInt8Value{3}},
		}}

		// Hats.TOP
		test.expectedGraph().ResolvedValues["TYPE_KEY:mojom.test.Foo.Hats.TOP"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:    test.newDeclData("TOP", "mojom.test.Foo.Hats.TOP"),
			EnumTypeKey: "TYPE_KEY:mojom.test.Foo.Hats",
			IntValue:    0,
		}}

		// Hats.COWBOY
		test.expectedGraph().ResolvedValues["TYPE_KEY:mojom.test.Foo.Hats.COWBOY"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:    test.newDeclData("COWBOY", "mojom.test.Foo.Hats.COWBOY"),
			EnumTypeKey: "TYPE_KEY:mojom.test.Foo.Hats",
			IntValue:    3,
			InitializerValue: &mojom_types.ValueUserValueReference{mojom_types.UserValueReference{
				Identifier: "NUM_MAGI",
				ValueKey:   stringPointer("TYPE_KEY:mojom.test.NUM_MAGI"),
			}},
		}}

		// Hats.HARD
		test.expectedGraph().ResolvedValues["TYPE_KEY:mojom.test.Foo.Hats.HARD"] = &mojom_types.UserDefinedValueEnumValue{mojom_types.EnumValue{
			DeclData:    test.newDeclData("HARD", "mojom.test.Foo.Hats.HARD"),
			EnumTypeKey: "TYPE_KEY:mojom.test.Foo.Hats",
			IntValue:    4,
		}}

		// ResolvedTypes

		// struct Foo
		test.expectedGraph().ResolvedTypes["TYPE_KEY:mojom.test.Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: &mojom_types.DeclarationData{
				ShortName:        stringPointer("Foo"),
				FullIdentifier:   stringPointer("mojom.test.Foo"),
				DeclaredOrdinal:  -1,
				DeclarationOrder: -1,
				SourceFileInfo: &mojom_types.SourceFileInfo{
					FileName: test.fileName(),
				},
				ContainedDeclarations: &mojom_types.ContainedDeclarations{
					Enums: &[]string{"TYPE_KEY:mojom.test.Foo.Hats"}},
			},
			Fields: []mojom_types.StructField{
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
				},
				// field y
				{
					DeclData:     test.newShortDeclDataAO(1, -1, "y", &[]mojom_types.Attribute{{"min_version", &mojom_types.LiteralValueInt8Value{2}}}),
					Type:         &mojom_types.TypeStringType{mojom_types.StringType{false}},
					DefaultValue: &mojom_types.DefaultFieldValueValue{&mojom_types.ValueLiteralValue{&mojom_types.LiteralValueStringValue{"hello"}}},
				},
				// field z
				{
					DeclData: test.newShortDeclDataO(2, -1, "z"),
					Type:     &mojom_types.TypeStringType{mojom_types.StringType{true}},
				},
			},
		}}

		// enum Hats
		test.expectedGraph().ResolvedTypes["TYPE_KEY:mojom.test.Foo.Hats"] = &mojom_types.UserDefinedTypeEnumType{mojom_types.MojomEnum{
			DeclData: test.newContainedDeclData("Hats", "mojom.test.Foo.Hats", stringPointer("TYPE_KEY:mojom.test.Foo")),
			Values: []mojom_types.EnumValue{
				// Note(rudominer) It is a bug that we need to copy the enum values here.
				// See https://github.com/domokit/mojo/issues/513.
				// value TOP
				test.expectedGraph().ResolvedValues["TYPE_KEY:mojom.test.Foo.Hats.TOP"].(*mojom_types.UserDefinedValueEnumValue).Value,
				// value COWBOY
				test.expectedGraph().ResolvedValues["TYPE_KEY:mojom.test.Foo.Hats.COWBOY"].(*mojom_types.UserDefinedValueEnumValue).Value,
				// value HARD
				test.expectedGraph().ResolvedValues["TYPE_KEY:mojom.test.Foo.Hats.HARD"].(*mojom_types.UserDefinedValueEnumValue).Value,
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Execute all of the test cases.
	////////////////////////////////////////////////////////////
	for _, c := range test.cases {
		// Parse and resolve the mojom input.
		descriptor := mojom.NewMojomDescriptor()
		parser := parser.MakeParser(c.fileName, c.fileName, c.mojomContents, descriptor, nil)
		parser.Parse()
		if !parser.OK() {
			t.Errorf("Parsing error for %s: %s", c.fileName, parser.GetError().Error())
			continue
		}
		if err := descriptor.Resolve(); err != nil {
			t.Errorf("Resolve error for %s: %s", c.fileName, err.Error())
			continue
		}
		if err := descriptor.ComputeFinalData(); err != nil {
			t.Errorf("ComputeFinalData error for %s: %s", c.fileName, err.Error())
			continue
		}

		// Simulate setting the canonical file name for the imported files. In real operation
		// this step is done in parser_driver.go when each of the imported files are parsed.
		mojomFile := parser.GetMojomFile()
		if mojomFile.Imports != nil {
			for _, imp := range mojomFile.Imports {
				imp.CanonicalFileName = fmt.Sprintf("%s.canonical", imp.SpecifiedName)
			}
		}

		// Serialize
		bytes, _, err := serialize(descriptor, false, false, c.lineAndcolumnNumbers, false, false)
		if err != nil {
			t.Errorf("Serialization error for %s: %s", c.fileName, err.Error())
			continue
		}

		// Serialize again and check for consistency.
		bytes2, _, err := serialize(descriptor, false, false, c.lineAndcolumnNumbers, false, false)
		if err != nil {
			t.Errorf("Serialization error for %s: %s", c.fileName, err.Error())
			continue
		}

		if !reflect.DeepEqual(bytes, bytes2) {
			t.Errorf("Inconsistent serialization for %s:\nbytes=%v\nbytes2=%v\n",
				c.fileName, bytes, bytes2)
			continue
		}

		// Deserialize
		decoder := bindings.NewDecoder(bytes, nil)
		fileGraph := mojom_files.MojomFileGraph{}
		fileGraph.Decode(decoder)

		// Compare
		if err := compareTwoGoObjects(c.expectedGraph, &fileGraph); err != nil {
			t.Errorf("%s:\n%s", c.fileName, err.Error())
			continue
		}
	}
}

// TestWithComputedData is similar to the previous test except that it sets
// emitComputedPackingData = true.
func TestWithComputedData(t *testing.T) {
	test := singleFileTest{}

	////////////////////////////////////////////////////////////
	// Test Case: Empty struct
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct Foo{
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields:   []mojom_types.StructField{},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     0,
					NumBytes:      8,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Test struct field min versions: 1,2
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct Foo{
	  int32 x;
	  int32 y;

	  [MinVersion = 1]
	  array<int32>? z;

      [MinVersion = 2]
	  array<int32>? w;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   0,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, -1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   4,
				},
				// field z
				{
					DeclData:   test.newShortDeclDataAO(2, -1, "z", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{1}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 1,
					Offset:     8,
				},
				// field w
				{
					DeclData:   test.newShortDeclDataAO(3, -1, "w", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{2}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 2,
					Offset:     16,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     2,
					NumBytes:      16,
				},
				mojom_types.StructVersion{
					VersionNumber: 1,
					NumFields:     3,
					NumBytes:      24,
				},
				mojom_types.StructVersion{
					VersionNumber: 2,
					NumFields:     4,
					NumBytes:      32,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Test struct field min versions: 1, 3
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct Foo{
	  int32 x;
	  int32 y;

	  [MinVersion = 1]
	  array<int32>? z;

      [MinVersion = 3]
	  array<int32>? w;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   0,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, -1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   4,
				},
				// field z
				{
					DeclData:   test.newShortDeclDataAO(2, -1, "z", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{1}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 1,
					Offset:     8,
				},
				// field w
				{
					DeclData:   test.newShortDeclDataAO(3, -1, "w", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{3}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 3,
					Offset:     16,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     2,
					NumBytes:      16,
				},
				mojom_types.StructVersion{
					VersionNumber: 1,
					NumFields:     3,
					NumBytes:      24,
				},
				mojom_types.StructVersion{
					VersionNumber: 3,
					NumFields:     4,
					NumBytes:      32,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Test struct field min versions: 1, 1
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct Foo{
	  int32 x;
	  int32 y;

	  [MinVersion = 1]
	  array<int32>? z;

      [MinVersion = 1]
	  array<int32>? w;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   0,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, -1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   4,
				},
				// field z
				{
					DeclData:   test.newShortDeclDataAO(2, -1, "z", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{1}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 1,
					Offset:     8,
				},
				// field w
				{
					DeclData:   test.newShortDeclDataAO(3, -1, "w", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{1}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 1,
					Offset:     16,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     2,
					NumBytes:      16,
				},
				mojom_types.StructVersion{
					VersionNumber: 1,
					NumFields:     4,
					NumBytes:      32,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Test struct field min versions: 1,2 with specified ordinals
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct Foo{
	  int32 y@1;

	  [MinVersion = 1]
	  array<int32>? z@2;

      [MinVersion = 2]
	  array<int32>? w@3;

	  int32 x@0;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:Foo"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:Foo"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("Foo", "Foo"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(3, 0, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   0,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(0, 1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   4,
				},
				// field z
				{
					DeclData:   test.newShortDeclDataAO(1, 2, "z", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{1}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 1,
					Offset:     8,
				},
				// field w
				{
					DeclData:   test.newShortDeclDataAO(2, 3, "w", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{2}}}),
					Type:       &mojom_types.TypeArrayType{mojom_types.ArrayType{true, -1, &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32}}},
					MinVersion: 2,
					Offset:     16,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     2,
					NumBytes:      16,
				},
				mojom_types.StructVersion{
					VersionNumber: 1,
					NumFields:     3,
					NumBytes:      24,
				},
				mojom_types.StructVersion{
					VersionNumber: 2,
					NumFields:     4,
					NumBytes:      32,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: 3 boolean fields
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct MyStruct1 {
	  bool b1;
	  bool b2;
	  bool b3;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct1"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct1"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("MyStruct1", "MyStruct1"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field b1
				{
					DeclData: test.newShortDeclDataO(0, -1, "b1"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      0,
				},
				// field b2
				{
					DeclData: test.newShortDeclDataO(1, -1, "b2"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      1,
				},
				// field b3
				{
					DeclData: test.newShortDeclDataO(2, -1, "b3"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      2,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     3,
					NumBytes:      16,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: int8 field + 2 boolean fields + int32field + 2 boolean fields
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct MyStruct1 {
	  int8 x;

	  bool b1;
	  bool b2;

	  int32 y;

	  bool b3;
	  bool b4;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct1"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct1"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("MyStruct1", "MyStruct1"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
					Offset:   0,
				},
				// field b1
				{
					DeclData: test.newShortDeclDataO(1, -1, "b1"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      0,
				},
				// field b2
				{
					DeclData: test.newShortDeclDataO(2, -1, "b2"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      1,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(3, -1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   4,
				},
				// field b3
				{
					DeclData: test.newShortDeclDataO(4, -1, "b3"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      2,
				},
				// field b4
				{
					DeclData: test.newShortDeclDataO(5, -1, "b4"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      3,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     6,
					NumBytes:      16,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: int8 + int64 + bool + int32 + int8 + bool + int16
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct MyStruct1 {
	  int8 x;
	  int64 y;
	  bool b1;
	  int32 z;
	  int8 w;
	  bool b2;
	  int16 r;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct1"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct1"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("MyStruct1", "MyStruct1"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
					Offset:   0,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(1, -1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int64},
					Offset:   8,
				},
				// field b1
				{
					DeclData: test.newShortDeclDataO(2, -1, "b1"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      0,
				},
				// field z
				{
					DeclData: test.newShortDeclDataO(3, -1, "z"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   4,
				},
				// field w
				{
					DeclData: test.newShortDeclDataO(4, -1, "w"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
					Offset:   2,
				},
				// field b2
				{
					DeclData: test.newShortDeclDataO(5, -1, "b2"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      1,
				},
				// field r
				{
					DeclData: test.newShortDeclDataO(6, -1, "r"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int16},
					Offset:   16,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     7,
					NumBytes:      32,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Specified ordinals with int8 + int64 + bool + int32 + int8 + bool + int16
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct MyStruct1 {
	  int64 y@1;
	  bool b1@2;
	  int32 z@3;
	  bool b2@5;
	  int16 r@6;
	  int8 x@0;
	  int8 w@4;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct1"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct1"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("MyStruct1", "MyStruct1"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(5, 0, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
					Offset:   0,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(0, 1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int64},
					Offset:   8,
				},
				// field b1
				{
					DeclData: test.newShortDeclDataO(1, 2, "b1"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      0,
				},
				// field z
				{
					DeclData: test.newShortDeclDataO(2, 3, "z"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   4,
				},
				// field w
				{
					DeclData: test.newShortDeclDataO(6, 4, "w"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
					Offset:   2,
				},
				// field b2
				{
					DeclData: test.newShortDeclDataO(3, 5, "b2"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      1,
				},
				// field r
				{
					DeclData: test.newShortDeclDataO(4, 6, "r"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int16},
					Offset:   16,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     7,
					NumBytes:      32,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Ten bools
	////////////////////////////////////////////////////////////
	{
		contents := `
	struct MyStruct1 {
	  bool b0;
	  bool b1;
	  bool b2;
	  bool b3;
	  bool b4;
	  bool b5;
	  bool b6;
	  bool b7;
	  bool b8;
	  bool b9;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct1"}

		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct1"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("MyStruct1", "MyStruct1"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				{
					DeclData: test.newShortDeclDataO(0, -1, "b0"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      0,
				},
				{
					DeclData: test.newShortDeclDataO(1, -1, "b1"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      1,
				},
				{
					DeclData: test.newShortDeclDataO(2, -1, "b2"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      2,
				},
				{
					DeclData: test.newShortDeclDataO(3, -1, "b3"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      3,
				},
				{
					DeclData: test.newShortDeclDataO(4, -1, "b4"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      4,
				},
				{
					DeclData: test.newShortDeclDataO(5, -1, "b5"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      5,
				},
				{
					DeclData: test.newShortDeclDataO(6, -1, "b6"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      6,
				},
				{
					DeclData: test.newShortDeclDataO(7, -1, "b7"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   0,
					Bit:      7,
				},
				{
					DeclData: test.newShortDeclDataO(8, -1, "b8"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      0,
				},
				{
					DeclData: test.newShortDeclDataO(9, -1, "b9"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Bool},
					Offset:   1,
					Bit:      1,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     10,
					NumBytes:      16,
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: int8 + union + struct + interface-request + int32 + interface
	//
	// x           intfcreqst  my_union---------------------------------------->  my_struct------------>  y-------->  my_interface--------->
	// 0  1  2  3  4  5  6  7  8  9  10  11  12  13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
	//
	////////////////////////////////////////////////////////////
	{
		contents := `
	union MyUnion1{};

	interface MyInterface1{};

	struct MyStruct1 {
	  int8          x;
	  MyUnion1      my_union;
	  MyStruct1     my_struct;
	  MyInterface1& my_interface_request;
	  int32         y;
	  MyInterface1  my_interface;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Unions = &[]string{"TYPE_KEY:MyUnion1"}
		test.expectedFile().DeclaredMojomObjects.Interfaces = &[]string{"TYPE_KEY:MyInterface1"}
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct1"}

		// MyStruct1
		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct1"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("MyStruct1", "MyStruct1"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
					Offset:   0,
				},
				// field my_union
				{
					DeclData: test.newShortDeclDataO(1, -1, "my_union"),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, false, stringPointer("MyUnion1"), stringPointer("TYPE_KEY:MyUnion1")}},
					Offset: 8,
				},
				// field my_struct
				{
					DeclData: test.newShortDeclDataO(2, -1, "my_struct"),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, false, stringPointer("MyStruct1"), stringPointer("TYPE_KEY:MyStruct1")}},
					Offset: 24,
				},
				// field my_interface_request
				{
					DeclData: test.newShortDeclDataO(3, -1, "my_interface_request"),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, true, stringPointer("MyInterface1"), stringPointer("TYPE_KEY:MyInterface1")}},
					Offset: 4,
				},
				// field y
				{
					DeclData: test.newShortDeclDataO(4, -1, "y"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:   32,
				},
				// field my_interface
				{
					DeclData: test.newShortDeclDataO(5, -1, "my_interface"),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, false, stringPointer("MyInterface1"), stringPointer("TYPE_KEY:MyInterface1")}},
					Offset: 36,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     6,
					NumBytes:      56,
				},
			},
		}}

		// MyUnion1
		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyUnion1"] = &mojom_types.UserDefinedTypeUnionType{mojom_types.MojomUnion{
			DeclData: test.newDeclData("MyUnion1", "MyUnion1"),
			Fields:   []mojom_types.UnionField{},
		}}

		// MyInterface1
		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyInterface1"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: test.newDeclData("MyInterface1", "MyInterface1"),
			Methods:  map[uint32]mojom_types.MojomMethod{},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Test Case: Multiple versions with int8 + union + struct + interface-request + handle + interface
	//
	// x           intfcreqst  my_union---------------------------------------->  my_struct------------>  y-------->  my_interface--------->
	// 0  1  2  3  4  5  6  7  8  9  10  11  12  13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
	//
	////////////////////////////////////////////////////////////
	{
		contents := `
	union MyUnion1{};

	interface MyInterface1{};

	struct MyStruct1 {
	  int8          x;
	  MyUnion1      my_union;
	  MyStruct1     my_struct;

	  [MinVersion=1]
	  MyInterface1&? my_interface_request;

	  [MinVersion=2]
	  int32       y;

	  [MinVersion=2]
	  MyInterface1?  my_interface;
	};`

		test.addTestCase("", contents)

		test.expectedFile().DeclaredMojomObjects.Unions = &[]string{"TYPE_KEY:MyUnion1"}
		test.expectedFile().DeclaredMojomObjects.Interfaces = &[]string{"TYPE_KEY:MyInterface1"}
		test.expectedFile().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:MyStruct1"}

		// MyStruct1
		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyStruct1"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: test.newDeclData("MyStruct1", "MyStruct1"),
			Fields: []mojom_types.StructField{
				// The fields are in ordinal order and the first two arguments to newShortDeclDataO() are
				// declarationOrder and declaredOrdinal.
				// field x
				{
					DeclData: test.newShortDeclDataO(0, -1, "x"),
					Type:     &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int8},
					Offset:   0,
				},
				// field my_union
				{
					DeclData: test.newShortDeclDataO(1, -1, "my_union"),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, false, stringPointer("MyUnion1"), stringPointer("TYPE_KEY:MyUnion1")}},
					Offset: 8,
				},
				// field my_struct
				{
					DeclData: test.newShortDeclDataO(2, -1, "my_struct"),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, false, stringPointer("MyStruct1"), stringPointer("TYPE_KEY:MyStruct1")}},
					Offset: 24,
				},
				// field my_interface_request
				{
					DeclData: test.newShortDeclDataAO(3, -1, "my_interface_request", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{1}}}),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						true, true, stringPointer("MyInterface1"), stringPointer("TYPE_KEY:MyInterface1")}},
					Offset:     4,
					MinVersion: 1,
				},
				// field y
				{
					DeclData:   test.newShortDeclDataAO(4, -1, "y", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{2}}}),
					Type:       &mojom_types.TypeSimpleType{mojom_types.SimpleType_Int32},
					Offset:     32,
					MinVersion: 2,
				},
				// field my_interface
				{
					DeclData: test.newShortDeclDataAO(5, -1, "my_interface", &[]mojom_types.Attribute{{"MinVersion", &mojom_types.LiteralValueInt8Value{2}}}),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						true, false, stringPointer("MyInterface1"), stringPointer("TYPE_KEY:MyInterface1")}},
					Offset:     36,
					MinVersion: 2,
				},
			},
			VersionInfo: &[]mojom_types.StructVersion{
				mojom_types.StructVersion{
					VersionNumber: 0,
					NumFields:     3,
					NumBytes:      40,
				},
				mojom_types.StructVersion{
					VersionNumber: 1,
					NumFields:     4,
					NumBytes:      40,
				},
				mojom_types.StructVersion{
					VersionNumber: 2,
					NumFields:     6,
					NumBytes:      56,
				},
			},
		}}

		// MyUnion1
		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyUnion1"] = &mojom_types.UserDefinedTypeUnionType{mojom_types.MojomUnion{
			DeclData: test.newDeclData("MyUnion1", "MyUnion1"),
			Fields:   []mojom_types.UnionField{},
		}}

		// MyInterface1
		test.expectedGraph().ResolvedTypes["TYPE_KEY:MyInterface1"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: test.newDeclData("MyInterface1", "MyInterface1"),
			Methods:  map[uint32]mojom_types.MojomMethod{},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Execute all of the test cases.
	////////////////////////////////////////////////////////////
	for _, c := range test.cases {
		// Parse and resolve the mojom input.
		descriptor := mojom.NewMojomDescriptor()
		parser := parser.MakeParser(c.fileName, c.fileName, c.mojomContents, descriptor, nil)
		parser.Parse()
		if !parser.OK() {
			t.Errorf("Parsing error for %s: %s", c.fileName, parser.GetError().Error())
			continue
		}
		if err := descriptor.Resolve(); err != nil {
			t.Errorf("Resolve error for %s: %s", c.fileName, err.Error())
			continue
		}
		if err := descriptor.ComputeFinalData(); err != nil {
			t.Errorf("ComputeFinalData error for %s: %s", c.fileName, err.Error())
			continue
		}

		// Simulate setting the canonical file name for the imported files. In real operation
		// this step is done in parser_driver.go when each of the imported files are parsed.
		mojomFile := parser.GetMojomFile()
		if mojomFile.Imports != nil {
			for _, imp := range mojomFile.Imports {
				imp.CanonicalFileName = fmt.Sprintf("%s.canonical", imp.SpecifiedName)
			}
		}

		// Serialize. Notice that the fourth argument is |true|.
		bytes, _, err := serialize(descriptor, false, false, true, false, false)
		if err != nil {
			t.Errorf("Serialization error for %s: %s", c.fileName, err.Error())
			continue
		}

		// Serialize again and check for consistency.
		bytes2, _, err := serialize(descriptor, false, false, true, false, false)
		if err != nil {
			t.Errorf("Serialization error for %s: %s", c.fileName, err.Error())
			continue
		}

		if !reflect.DeepEqual(bytes, bytes2) {
			t.Errorf("Inconsistent serialization for %s:\nbytes=%v\nbytes2=%v\n",
				c.fileName, bytes, bytes2)
			continue
		}

		// Deserialize
		decoder := bindings.NewDecoder(bytes, nil)
		fileGraph := mojom_files.MojomFileGraph{}
		fileGraph.Decode(decoder)

		// Compare
		if err := compareTwoGoObjects(c.expectedGraph, &fileGraph); err != nil {
			t.Errorf("%s:\n%s", c.fileName, err.Error())
			continue
		}
	}
}

// TestMetaDataOnlyMode tests parsing and serialization in meta-data-only
// mode. Only file-level attributes and the 'module' statement should be
// parsed.
func TestMetaDataOnlyMode(t *testing.T) {
	test := singleFileTest{}
	////////////////////////////////////////////////////////////
	// Test Case:
	////////////////////////////////////////////////////////////
	{
		contents := `
	[go_namespace="go.test",
	lucky=true,
	planet=EARTH]
	module mojom.test;

	import "another.file";
	import "and.another.file";

	const uint16 NUM_MAGI = 3;

	struct Foo{
		int32 x;
		[min_version=2]
		string y = "hello";
		string? z;

		enum Hats {
			TOP,
			COWBOY = NUM_MAGI,
			HARD,
		};
	};`

		test.addTestCase("mojom.test", contents)

		// Attributes
		test.expectedFile().Attributes = &[]mojom_types.Attribute{
			{"go_namespace", &mojom_types.LiteralValueStringValue{"go.test"}},
			{"lucky", &mojom_types.LiteralValueBoolValue{true}},
			{"planet", &mojom_types.LiteralValueStringValue{"EARTH"}},
		}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Execute all of the test cases.
	////////////////////////////////////////////////////////////
	for _, c := range test.cases {
		// Parse and resolve the mojom input.
		descriptor := mojom.NewMojomDescriptor()
		parser := parser.MakeParser(c.fileName, c.fileName, c.mojomContents, descriptor, nil)
		parser.SetMetaDataOnlyMode(true)
		parser.Parse()
		if !parser.OK() {
			t.Errorf("Parsing error for %s: %s", c.fileName, parser.GetError().Error())
			continue
		}
		if err := descriptor.Resolve(); err != nil {
			t.Errorf("Resolve error for %s: %s", c.fileName, err.Error())
			continue
		}
		if err := descriptor.ComputeFinalData(); err != nil {
			t.Errorf("ComputeFinalData error for %s: %s", c.fileName, err.Error())
			continue
		}

		// Serialize
		bytes, _, err := serialize(descriptor, false, false, c.lineAndcolumnNumbers, false, false)
		if err != nil {
			t.Errorf("Serialization error for %s: %s", c.fileName, err.Error())
			continue
		}

		// Deserialize
		decoder := bindings.NewDecoder(bytes, nil)
		fileGraph := mojom_files.MojomFileGraph{}
		fileGraph.Decode(decoder)

		// Compare
		if err := compareTwoGoObjects(c.expectedGraph, &fileGraph); err != nil {
			t.Errorf("%s:\n%s", c.fileName, err.Error())
			continue
		}
	}
}

////////////////////////////////////////////
/// Two-File Tests
///////////////////////////////////////////

// twoFileTestCase stores the data for one serialization test case
// in which two files are added to the file graph.
type twoFileTestCase struct {
	// Is file B a top-level file?
	topLevel bool
	// If file A imports file B then this is the expected string that should
	// have been parsed from the import statement. Otherwise this is empty.
	importingName string
	// The contents of the two files
	mojomContentsA string
	mojomContentsB string

	lineAndcolumnNumbers         bool
	expectedFileA, expectedFileB *mojom_files.MojomFile
	expectedGraph                *mojom_files.MojomFileGraph
}

// twoFileTest contains a series of twoFileTestCases and a current
// testCaseNum.
type twoFileTest struct {
	cases       []twoFileTestCase
	testCaseNum int
}

// expectedFileA() returns the expectedFileA of the current test case.
func (t *twoFileTest) expectedFileA() *mojom_files.MojomFile {
	return t.cases[t.testCaseNum].expectedFileA
}

// expectedFileB() returns the expectedFileB of the current test case.
func (t *twoFileTest) expectedFileB() *mojom_files.MojomFile {
	return t.cases[t.testCaseNum].expectedFileB
}

// expectedGraph() returns the expectedGraph of the current test case.
func (t *twoFileTest) expectedGraph() *mojom_files.MojomFileGraph {
	return t.cases[t.testCaseNum].expectedGraph
}

func canonicalFileName(name string) string {
	return fmt.Sprintf("/my/file/system/%s", name)
}

// addTestCase() should be invoked at the start of a case in
// TestSingleFileSerialization.
// moduleNameSpace: The expected module namespace for the two parsed files.
// contentsA, contentsB: The .mojom file contents of the two files.
// topLevel: Are we simulating File B being a top-level file (as opposed to
//           one found only because it is imported from file A.)
// importingName: If non-empty, the string expected to be parsed from the
//                import statement in File A.
func (test *twoFileTest) addTestCase(moduleNameSpace, contentsA, contentsB string,
	topLevel bool, importingName string) {
	fileNameA := fmt.Sprintf("file%dA", test.testCaseNum)
	fileNameB := fmt.Sprintf("file%dB", test.testCaseNum)
	test.cases = append(test.cases, twoFileTestCase{topLevel, importingName, contentsA, contentsB, false,
		new(mojom_files.MojomFile), new(mojom_files.MojomFile), new(mojom_files.MojomFileGraph)})
	test.expectedFileA().FileName = canonicalFileName(fileNameA)
	test.expectedFileB().FileName = canonicalFileName(fileNameB)
	test.expectedFileA().SpecifiedFileName = stringPointer(fileNameA)
	specifiedNameB := ""
	if topLevel {
		// File B should have a non-empty |specified_file_name| just in case it is a top-level file.
		specifiedNameB = fileNameB
	}
	test.expectedFileB().SpecifiedFileName = stringPointer(specifiedNameB)
	test.expectedFileA().ModuleNamespace = &moduleNameSpace
	test.expectedFileB().ModuleNamespace = &moduleNameSpace

	if importingName != "" {
		// Add and import to expected File A.
		test.expectedFileA().Imports = new([]string)
		*test.expectedFileA().Imports = append(*test.expectedFileA().Imports, test.expectedFileB().FileName)
	}

	test.expectedGraph().ResolvedTypes = make(map[string]mojom_types.UserDefinedType)
	test.expectedGraph().ResolvedValues = make(map[string]mojom_types.UserDefinedValue)
}

// endTestCase() should be invoked at the end of a case in
// TestSingleFileSerialization.
func (test *twoFileTest) endTestCase() {
	test.expectedGraph().Files = make(map[string]mojom_files.MojomFile)
	test.expectedGraph().Files[test.expectedFileA().FileName] = *test.expectedFileA()
	test.expectedGraph().Files[test.expectedFileB().FileName] = *test.expectedFileB()
	test.testCaseNum += 1
}

// TestTwoFileSerialization uses a series of test cases in which the text of two .mojom
// files is specified and the expected MojomFileGraph is specified using Go struct literals.
func TestTwoFileSerialization(t *testing.T) {
	test := twoFileTest{}

	/////////////////////////////////////////////////////////////
	// Test Case: Two top-level files with no import relationship
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	struct FooA{
	};`

		contentsB := `
	module a.b.c;
	struct FooB{
	};`

		importingName := "" // File A is not importing file B.
		topLevel := true    // Simulate that File B is a top-level file.
		test.addTestCase("a.b.c", contentsA, contentsB, topLevel, importingName)

		// DeclaredMojomObjects
		test.expectedFileA().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:a.b.c.FooA"}
		test.expectedFileB().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:a.b.c.FooB"}

		// struct FooA
		test.expectedGraph().ResolvedTypes["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.expectedFileA().FileName, "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// struct FooB
		test.expectedGraph().ResolvedTypes["TYPE_KEY:a.b.c.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.expectedFileB().FileName, "FooB", "a.b.c.FooB"),
			Fields:   []mojom_types.StructField{}}}

		test.endTestCase()
	}

	/////////////////////////////////////////////////////////////
	// Test Case: Two top-level files where the first imports the second.
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	import "myLittleFriend";
	struct FooA{
	};`

		contentsB := `
	module a.b.c;
	struct FooB{
	};`

		importingName := "myLittleFriend" // File A is importing File B using this name.
		topLevel := true                  // Simulate the File B is a top-level file.
		test.addTestCase("a.b.c", contentsA, contentsB, topLevel, importingName)

		// DeclaredMojomObjects
		test.expectedFileA().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:a.b.c.FooA"}
		test.expectedFileB().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:a.b.c.FooB"}

		// struct FooA
		test.expectedGraph().ResolvedTypes["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.expectedFileA().FileName, "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// struct FooB
		test.expectedGraph().ResolvedTypes["TYPE_KEY:a.b.c.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.expectedFileB().FileName, "FooB", "a.b.c.FooB"),
			Fields:   []mojom_types.StructField{}}}

		test.endTestCase()
	}

	/////////////////////////////////////////////////////////////
	// Test Case: A top-level file that imports a non-top-level file.
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	import "myLittleFriend";
	struct FooA{
	};`

		contentsB := `
	module a.b.c;
	struct FooB{
	};`

		importingName := "myLittleFriend" // File A is importing File B using this name.
		topLevel := false                 // Simulate the File B is not a top-level file.
		test.addTestCase("a.b.c", contentsA, contentsB, topLevel, importingName)

		// DeclaredMojomObjects
		test.expectedFileA().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:a.b.c.FooA"}
		test.expectedFileB().DeclaredMojomObjects.Structs = &[]string{"TYPE_KEY:a.b.c.FooB"}

		// struct FooA
		test.expectedGraph().ResolvedTypes["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.expectedFileA().FileName, "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// struct FooB
		test.expectedGraph().ResolvedTypes["TYPE_KEY:a.b.c.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.expectedFileB().FileName, "FooB", "a.b.c.FooB"),
			Fields:   []mojom_types.StructField{}}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Execute all of the test cases.
	////////////////////////////////////////////////////////////
	for i, c := range test.cases {
		descriptor := mojom.NewMojomDescriptor()

		// Parse file A.
		parserA := parser.MakeParser(c.expectedFileA.FileName, *c.expectedFileA.SpecifiedFileName, c.mojomContentsA, descriptor, nil)
		parserA.Parse()
		if !parserA.OK() {
			t.Errorf("Parsing error for %s: %s", c.expectedFileA.FileName, parserA.GetError().Error())
			continue
		}
		mojomFileA := parserA.GetMojomFile()

		// Parse file B.
		var importedFrom *mojom.MojomFile
		if !c.topLevel {
			// If file B is not a top-level file then when the parser for it is constructed we give it a non-nil |importedFrom|.
			importedFrom = mojomFileA
		}
		parserB := parser.MakeParser(c.expectedFileB.FileName, *c.expectedFileB.SpecifiedFileName, c.mojomContentsB, descriptor, importedFrom)
		parserB.Parse()
		if !parserB.OK() {
			t.Errorf("Parsing error for %s: %s", c.expectedFileB.FileName, parserB.GetError().Error())
			continue
		}
		mojomFileB := parserB.GetMojomFile()

		// Set the canonical file name for the imported files. In real operation
		// this step is done in parser_driver.go when each of the imported files are parsed.
		if c.importingName != "" {
			// The call to SetCanonicalImportName does a lookup in a map for a key corresponding to the
			// first argument. Thus here we are also testing that |importingName| is in fact string
			// that was parsed from the .mojom file.
			mojomFileA.SetCanonicalImportName(c.importingName, mojomFileB.CanonicalFileName)
		}

		// Resolve
		if err := descriptor.Resolve(); err != nil {
			t.Errorf("Resolve error for case %d: %s", i, err.Error())
			continue
		}
		if err := descriptor.ComputeFinalData(); err != nil {
			t.Errorf("ComputeFinalData error for case %d: %s", i, err.Error())
			continue
		}

		// Serialize
		bytes, _, err := serialize(descriptor, false, false, c.lineAndcolumnNumbers, false, false)
		if err != nil {
			t.Errorf("Serialization error for case %d: %s", i, err.Error())
			continue
		}

		// Deserialize
		decoder := bindings.NewDecoder(bytes, nil)
		fileGraph := mojom_files.MojomFileGraph{}
		fileGraph.Decode(decoder)

		// Compare
		if err := compareTwoGoObjects(c.expectedGraph, &fileGraph); err != nil {
			t.Errorf("case %d:\n%s", i, err.Error())
			continue
		}
	}
}

////////////////////////////////////////////
/// Serialized Runtime Type Info Tests
///////////////////////////////////////////

type runtimeTypeInfoTestCase struct {
	// The contents of the two files
	mojomContentsA           string
	mojomContentsB           string
	expectedRuntimeTypeInfoA *mojom_types.RuntimeTypeInfo
	expectedRuntimeTypeInfoB *mojom_types.RuntimeTypeInfo
}

type runtimeTypeInfoTest struct {
	cases       []runtimeTypeInfoTestCase
	testCaseNum int
}

func (t *runtimeTypeInfoTest) expectedRuntimeTypeInfoA() *mojom_types.RuntimeTypeInfo {
	return t.cases[t.testCaseNum].expectedRuntimeTypeInfoA
}

func (t *runtimeTypeInfoTest) expectedRuntimeTypeInfoB() *mojom_types.RuntimeTypeInfo {
	return t.cases[t.testCaseNum].expectedRuntimeTypeInfoB
}

func (test *runtimeTypeInfoTest) addTestCase(contentsA, contentsB string) {
	test.cases = append(test.cases, runtimeTypeInfoTestCase{contentsA, contentsB, new(mojom_types.RuntimeTypeInfo), new(mojom_types.RuntimeTypeInfo)})
	test.expectedRuntimeTypeInfoA().ServicesByName = make(map[string]mojom_types.ServiceTypeInfo)
	test.expectedRuntimeTypeInfoA().TypeMap = make(map[string]mojom_types.UserDefinedType)
	test.expectedRuntimeTypeInfoB().ServicesByName = make(map[string]mojom_types.ServiceTypeInfo)
	test.expectedRuntimeTypeInfoB().TypeMap = make(map[string]mojom_types.UserDefinedType)
}

func (test *runtimeTypeInfoTest) fileNameA() string {
	return fmt.Sprintf("file%dA", test.testCaseNum)
}

func (test *runtimeTypeInfoTest) fileNameB() string {
	return fmt.Sprintf("file%dB", test.testCaseNum)
}

func (test *runtimeTypeInfoTest) endTestCase() {
	test.testCaseNum += 1
}

// TestRuntimeTypeInfo uses a series of test cases in which the text of two .mojom
// files is specified and the expected RuntimeTypeInfos are specified using Go struct literals.
func TestRuntimeTypeInfo(t *testing.T) {
	test := runtimeTypeInfoTest{}

	/////////////////////////////////////////////////////////////
	// Test Case: No nterfaces.
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	struct FooA{
	};`

		contentsB := `
	module b.c.d;
	struct FooB{
	};`

		test.addTestCase(contentsA, contentsB)

		// TypeMap for file A
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameA(), "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// TypeMap for file B
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameB(), "FooB", "b.c.d.FooB"),
			Fields:   []mojom_types.StructField{}}}

		test.endTestCase()
	}

	/////////////////////////////////////////////////////////////
	// Test Case:  Two interfaces: Not top-level.
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	struct FooA{
	};

    interface InterfaceA {
    	DoIt(FooA x) => (b.c.d.FooB? y);
    };
	`

		contentsB := `
	module b.c.d;
	struct FooB{
	};

	interface InterfaceB {
    	DoIt(a.b.c.FooA x) => (FooB? y);
    };

	`
		test.addTestCase(contentsA, contentsB)

		// TypeMap for file A

		// FooA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameA(), "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// InterfaceA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.InterfaceA"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclData(test.fileNameA(), "InterfaceA", "a.b.c.InterfaceA"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameA(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("b.c.d.FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
						},
					},
				},
			},
		}}

		////////////////////////////////////////////////////////////////////////

		// TypeMap for file B

		// FooA
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameB(), "FooB", "b.c.d.FooB"),
			Fields:   []mojom_types.StructField{}}}

		// InterfaceB
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.InterfaceB"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclData(test.fileNameB(), "InterfaceB", "b.c.d.InterfaceB"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameB(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("a.b.c.FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
						},
					},
				},
			},
		}}

		test.endTestCase()
	}

	/////////////////////////////////////////////////////////////
	// Test Case:  Two interfaces: One of them top-level.
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	struct FooA{
	};

	[ServiceName = "AwesomeService"]
    interface InterfaceA {
    	DoIt(FooA x) => (b.c.d.FooB? y);
    };
	`

		contentsB := `
	module b.c.d;
	struct FooB{
	};

	interface InterfaceB {
    	DoIt(a.b.c.FooA x) => (FooB? y);
    };

	`
		test.addTestCase(contentsA, contentsB)

		// ServicesByName for file A
		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_types.ServiceTypeInfo{
			TopLevelInterface: "TYPE_KEY:a.b.c.InterfaceA",
			CompleteTypeSet:   []string{"TYPE_KEY:a.b.c.FooA", "TYPE_KEY:a.b.c.InterfaceA", "TYPE_KEY:b.c.d.FooB"},
		}

		// TypeMap for file A

		// FooA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameA(), "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// InterfaceA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.InterfaceA"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclDataA(test.fileNameA(), "InterfaceA", "a.b.c.InterfaceA",
				&[]mojom_types.Attribute{{"ServiceName", &mojom_types.LiteralValueStringValue{"AwesomeService"}}}),
			ServiceName: stringPointer("AwesomeService"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameA(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("b.c.d.FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
						},
					},
				},
			},
		}}

		////////////////////////////////////////////////////////////////////////

		// TypeMap for file B

		// FooA
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameB(), "FooB", "b.c.d.FooB"),
			Fields:   []mojom_types.StructField{}}}

		// InterfaceB
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.InterfaceB"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclData(test.fileNameB(), "InterfaceB", "b.c.d.InterfaceB"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameB(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("a.b.c.FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
						},
					},
				},
			},
		}}

		test.endTestCase()
	}

	/////////////////////////////////////////////////////////////
	// Test Case:  Same as above with extra attributes.
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	struct FooA{
	};

	[Color="RED", ServiceName = 7, ServiceName = "AwesomeService", Height=10.1]
    interface InterfaceA {
    	DoIt(FooA x) => (b.c.d.FooB? y);
    };
	`

		contentsB := `
	module b.c.d;
	struct FooB{
	};

	[ServiceName = 42]
	interface InterfaceB {
    	DoIt(a.b.c.FooA x) => (FooB? y);
    };

	`
		test.addTestCase(contentsA, contentsB)

		// ServicesByName for file A
		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_types.ServiceTypeInfo{
			TopLevelInterface: "TYPE_KEY:a.b.c.InterfaceA",
			CompleteTypeSet:   []string{"TYPE_KEY:a.b.c.FooA", "TYPE_KEY:a.b.c.InterfaceA", "TYPE_KEY:b.c.d.FooB"},
		}

		// TypeMap for file A

		// FooA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameA(), "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// InterfaceA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.InterfaceA"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclDataA(test.fileNameA(), "InterfaceA", "a.b.c.InterfaceA",
				&[]mojom_types.Attribute{
					{"Color", &mojom_types.LiteralValueStringValue{"RED"}},
					{"ServiceName", &mojom_types.LiteralValueInt8Value{7}},
					{"ServiceName", &mojom_types.LiteralValueStringValue{"AwesomeService"}},
					{"Height", &mojom_types.LiteralValueDoubleValue{10.1}}}),
			ServiceName: stringPointer("AwesomeService"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameA(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("b.c.d.FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
						},
					},
				},
			},
		}}

		////////////////////////////////////////////////////////////////////////

		// TypeMap for file B

		// FooA
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameB(), "FooB", "b.c.d.FooB"),
			Fields:   []mojom_types.StructField{}}}

		// InterfaceB
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.InterfaceB"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclDataA(test.fileNameB(), "InterfaceB", "b.c.d.InterfaceB",
				&[]mojom_types.Attribute{{"ServiceName", &mojom_types.LiteralValueInt8Value{42}}}),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameB(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("a.b.c.FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
						},
					},
				},
			},
		}}

		test.endTestCase()
	}

	/////////////////////////////////////////////////////////////
	// Test Case:  Additional reachable types.
	/////////////////////////////////////////////////////////////
	{

		contentsA := `
	module a.b.c;
	struct FooA{
	};

	[ServiceName = "AwesomeService"]
    interface InterfaceA {
    	DoIt(FooA x) => (b.c.d.FooB? y);
    };
	`

		contentsB := `
	module b.c.d;

	enum Enum1{}; // This is in the CompleteTypeSet of InterfaceA
	enum Enum2{}; // This is not.

	struct FooB{
		Enum1 x;
	};

	interface InterfaceB {
    	DoIt(a.b.c.FooA x) => (FooB? y, Enum2 z);
    };

	`
		test.addTestCase(contentsA, contentsB)

		// ServicesByName for file A
		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_types.ServiceTypeInfo{
			TopLevelInterface: "TYPE_KEY:a.b.c.InterfaceA",
			CompleteTypeSet:   []string{"TYPE_KEY:a.b.c.FooA", "TYPE_KEY:a.b.c.InterfaceA", "TYPE_KEY:b.c.d.Enum1", "TYPE_KEY:b.c.d.FooB"},
		}

		// TypeMap for file A

		// FooA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.FooA"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameA(), "FooA", "a.b.c.FooA"),
			Fields:   []mojom_types.StructField{}}}

		// InterfaceA
		test.expectedRuntimeTypeInfoA().TypeMap["TYPE_KEY:a.b.c.InterfaceA"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclDataA(test.fileNameA(), "InterfaceA", "a.b.c.InterfaceA",
				&[]mojom_types.Attribute{{"ServiceName", &mojom_types.LiteralValueStringValue{"AwesomeService"}}}),
			ServiceName: stringPointer("AwesomeService"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameA(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameA(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameA(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("b.c.d.FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
						},
					},
				},
			},
		}}

		////////////////////////////////////////////////////////////////////////

		// TypeMap for file B

		// Enum1
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.Enum1"] = &mojom_types.UserDefinedTypeEnumType{mojom_types.MojomEnum{
			DeclData: newDeclData(test.fileNameB(), "Enum1", "b.c.d.Enum1"),
			Values:   []mojom_types.EnumValue{},
		}}

		// Enum2
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.Enum2"] = &mojom_types.UserDefinedTypeEnumType{mojom_types.MojomEnum{
			DeclData: newDeclData(test.fileNameB(), "Enum2", "b.c.d.Enum2"),
			Values:   []mojom_types.EnumValue{},
		}}

		// FooA
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.FooB"] = &mojom_types.UserDefinedTypeStructType{mojom_types.MojomStruct{
			DeclData: newDeclData(test.fileNameB(), "FooB", "b.c.d.FooB"),
			Fields: []mojom_types.StructField{
				mojom_types.StructField{
					DeclData: newDeclDataO(0, -1, test.fileNameB(), "x", ""),
					Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
						false, false, stringPointer("Enum1"), stringPointer("TYPE_KEY:b.c.d.Enum1")}},
				},
			},
		}}

		// InterfaceB
		test.expectedRuntimeTypeInfoB().TypeMap["TYPE_KEY:b.c.d.InterfaceB"] = &mojom_types.UserDefinedTypeInterfaceType{mojom_types.MojomInterface{
			DeclData: newDeclData(test.fileNameB(), "InterfaceB", "b.c.d.InterfaceB"),
			Methods: map[uint32]mojom_types.MojomMethod{
				0: mojom_types.MojomMethod{
					DeclData: newDeclData(test.fileNameB(), "DoIt", ""),
					Parameters: mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-request", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "x", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("a.b.c.FooA"), stringPointer("TYPE_KEY:a.b.c.FooA")}},
							},
						},
					},
					ResponseParams: &mojom_types.MojomStruct{
						DeclData: newDeclData(test.fileNameB(), "DoIt-response", ""),
						Fields: []mojom_types.StructField{
							mojom_types.StructField{
								DeclData: newDeclDataO(0, -1, test.fileNameB(), "y", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									true, false, stringPointer("FooB"), stringPointer("TYPE_KEY:b.c.d.FooB")}},
							},
							mojom_types.StructField{
								DeclData: newDeclDataO(1, -1, test.fileNameB(), "z", ""),
								Type: &mojom_types.TypeTypeReference{mojom_types.TypeReference{
									false, false, stringPointer("Enum2"), stringPointer("TYPE_KEY:b.c.d.Enum2")}},
							},
						},
					},
				},
			},
		}}

		test.endTestCase()
	}

	////////////////////////////////////////////////////////////
	// Execute all of the test cases.
	////////////////////////////////////////////////////////////
	for i, c := range test.cases {
		descriptor := mojom.NewMojomDescriptor()
		fileNameA := fmt.Sprintf("file%dA", i)
		fileNameB := fmt.Sprintf("file%dB", i)

		// Parse file A.
		parserA := parser.MakeParser(fileNameA, fileNameA, c.mojomContentsA, descriptor, nil)
		parserA.Parse()
		if !parserA.OK() {
			t.Errorf("Parsing error for %s: %s", fileNameA, parserA.GetError().Error())
			continue
		}

		// Parse file B.
		parserB := parser.MakeParser(fileNameB, fileNameB, c.mojomContentsB, descriptor, nil)
		parserB.Parse()
		if !parserB.OK() {
			t.Errorf("Parsing error for %s: %s", fileNameB, parserB.GetError().Error())
			continue
		}

		// Resolve
		if err := descriptor.Resolve(); err != nil {
			t.Errorf("Resolve error for case %d: %s", i, err.Error())
			continue
		}
		if err := descriptor.ComputeFinalData(); err != nil {
			t.Errorf("ComputeFinalData error for case %d: %s", i, err.Error())
			continue
		}

		// Serialize
		bytes, _, err := serialize(descriptor, false, false, false, true, true)
		if err != nil {
			t.Errorf("Serialization error for case %d: %s", i, err.Error())
			continue
		}

		// Deserialize
		decoder := bindings.NewDecoder(bytes, nil)
		fileGraph := mojom_files.MojomFileGraph{}
		fileGraph.Decode(decoder)

		// Deserialize  RuntimeTypeInfo A
		runtimeTypeInfoA := deserializeRuntimeTypeInfo(*fileGraph.Files[fileNameA].SerializedRuntimeTypeInfo)

		// Deserialize  RuntimeTypeInfo B
		runtimeTypeInfoB := deserializeRuntimeTypeInfo(*fileGraph.Files[fileNameB].SerializedRuntimeTypeInfo)

		// Compare A
		if err := compareTwoGoObjects(c.expectedRuntimeTypeInfoA, &runtimeTypeInfoA); err != nil {
			t.Errorf("case %d A:\n%s", i, err.Error())
		}

		// Compare B
		if err := compareTwoGoObjects(c.expectedRuntimeTypeInfoB, &runtimeTypeInfoB); err != nil {
			t.Errorf("case %d B:\n%s", i, err.Error())
		}

		// Test the parameter populateCompleteTypeSet. We set the final
		// parameter to false.
		bytes, _, err = serialize(descriptor, false, false, false, true, false)
		if err != nil {
			t.Errorf("Serialization error for case %d: %s", i, err.Error())
			continue
		}

		// Deserialize
		decoder = bindings.NewDecoder(bytes, nil)
		fileGraph = mojom_files.MojomFileGraph{}
		fileGraph.Decode(decoder)
		runtimeTypeInfoA = deserializeRuntimeTypeInfo(*fileGraph.Files[fileNameA].SerializedRuntimeTypeInfo)

		// Check that CompleteTypeSet has not been populated for any service.
		for name, service := range runtimeTypeInfoA.ServicesByName {
			length := len(service.CompleteTypeSet)
			if length != 0 {
				t.Errorf("len(CompleteTypeSet)=%d for service=%q", length, name)
			}
		}
	}
}

func deserializeRuntimeTypeInfo(base64String string) mojom_types.RuntimeTypeInfo {
	compressedBytes, err := base64.StdEncoding.DecodeString(base64String)
	if err != nil {
		panic(fmt.Sprintf("Error while unencoding runtimeTypeInfo: %s", err.Error()))
	}
	reader, err2 := gzip.NewReader(bytes.NewBuffer(compressedBytes))
	if err2 != nil {
		panic(fmt.Sprintf("Error while decompressing runtimeTypeInfo: %s", err.Error()))
	}
	uncompressedBytes, err3 := ioutil.ReadAll(reader)
	if err3 != nil {
		panic(fmt.Sprintf("Error while decompressing runtimeTypeInfo: %s", err2.Error()))
	}
	if err = reader.Close(); err != nil {
		panic(fmt.Sprintf("Error while decompressing runtimeTypeInfo: %s", err.Error()))
	}
	decoder := bindings.NewDecoder(uncompressedBytes, nil)
	runtimeTypeInfo := mojom_types.RuntimeTypeInfo{}
	runtimeTypeInfo.Decode(decoder)
	return runtimeTypeInfo
}

// compareTwoGoObjects compares |expected| and |actual| and returns a non-nil
// error if they are not deeply equal. The error message contains a human-readable
// string containing a deep-print of expected and actual along with the substrings
// starting from the first character where they differ.
func compareTwoGoObjects(expected interface{}, actual interface{}) error {
	if !reflect.DeepEqual(expected, actual) {
		// Note(rudominer) The myfmt package is a local modification of the fmt package
		// that does a deep printing that follows pointers for up to 50 levels.
		// Thus expectedString and actualString should contain enough information to
		// precisely capture the structure of expected and actual.
		expectedString := myfmt.Sprintf("%#v", expected)
		actualString := myfmt.Sprintf("%#v", actual)
		if expectedString != actualString {
			diffPos := -1
			for i := 0; i < len(expectedString) && i < len(actualString); i++ {
				if expectedString[i] != actualString[i] {
					diffPos = i
					break
				}
			}
			mismatchExpected := ""
			mismatchActual := ""
			if diffPos > -1 {
				mismatchExpected = expectedString[diffPos:]
				mismatchActual = actualString[diffPos:]
			}
			return fmt.Errorf("*****\nexpected=\n*****\n%q\n*****\nactual=\n*****\n%q\n*****\n"+
				"match failed at position %d: expected=\n*****\n%q\n******\nactual=\n*****\n%q\n******\n",
				expectedString, actualString, diffPos, mismatchExpected, mismatchActual)
		} else {
			return fmt.Errorf("expected != actual but the two printed equal.")
		}
	}
	return nil
}
