package parser

import (
	"mojom/mojom_parser/lexer"
	"mojom/mojom_parser/mojom"
	"testing"
)

func TestAttachComments(t *testing.T) {
	checkEq := func(expected, actual interface{}) {
		if expected != actual {
			t.Fatalf("Failed check: Expected (%v), Actual (%v)", expected, actual)
		}
	}

	source := `
	// TopComment

	// NextComment
	/* LeftAttrsComment */[Key1="SomeModule", // AttrsRightComment
	Key2=10, // Key2AttrRightComment
	Key3=12]
	module hello.world;

	import "import1";
	import "import2";

	interface InterfaceFoo {
		Method1(int32 in_param1 /* InParam1Comment */, int32 in_param2); // Method1RightComment
		// FinalInterfaceComment
	};

	// FinalComments
	`

	descriptor := mojom.NewMojomDescriptor()
	parser := MakeParser("TestAttachComments", "TestAttachComments", source, descriptor, nil)
	parser.Parse()

	if !parser.OK() {
		t.Errorf("Parser was not supposed to fail: %v", parser.GetError().Error())
	}

	mojomFile := parser.GetMojomFile()
	comments := parser.GetComments()

	mojom.AttachCommentsToMojomFile(mojomFile, comments)

	topAttrComments := mojomFile.Attributes.AttachedComments()
	checkEq(lexer.EmptyLine, topAttrComments.Above[0].Kind)
	checkEq("// TopComment", topAttrComments.Above[1].Text)
	checkEq(lexer.EmptyLine, topAttrComments.Above[2].Kind)
	checkEq("// NextComment", topAttrComments.Above[3].Text)
	checkEq("/* LeftAttrsComment */", topAttrComments.Left[0].Text)
	checkEq("// AttrsRightComment", topAttrComments.Right[0].Text)

	key2AttrComments := mojomFile.Attributes.List[1].AttachedComments()
	checkEq("// Key2AttrRightComment", key2AttrComments.Right[0].Text)

	interfaceFoo := mojomFile.DeclaredObjects[0].(*mojom.MojomInterface)
	// Sanity-check that we got the right object.
	checkEq("InterfaceFoo", interfaceFoo.SimpleName())
	checkEq("// FinalInterfaceComment", interfaceFoo.AttachedComments().Final[0].Text)

	method1 := interfaceFoo.MethodsByOrdinal[0]
	// Sanity-check that we got the right method.
	checkEq("Method1", method1.SimpleName())

	inParam1 := method1.Parameters.Fields[0]
	// Sanity-check that we got the right field.
	checkEq("in_param1", inParam1.SimpleName())

	checkEq("// Method1RightComment", method1.AttachedComments().Right[0].Text)
	checkEq("/* InParam1Comment */", inParam1.AttachedComments().Right[0].Text)

	checkEq(lexer.EmptyLine, mojomFile.FinalComments[0].Kind)
	checkEq("// FinalComments", mojomFile.FinalComments[1].Text)
}

func TestEmptyFile(t *testing.T) {
	descriptor := mojom.NewMojomDescriptor()
	parser := MakeParser("TestEmptyFile", "TestEmptyFile", "", descriptor, nil)
	parser.Parse()

	mojomFile := parser.GetMojomFile()
	comments := parser.GetComments()

	mojom.AttachCommentsToMojomFile(mojomFile, comments)
}

func TestNoComments(t *testing.T) {
	source := `
	module hello.world;

	interface InterfaceFoo {
		Method1(int32 in_param1);
	};
	`
	descriptor := mojom.NewMojomDescriptor()
	parser := MakeParser("TestNoComments", "TestNoComments", source, descriptor, nil)
	parser.Parse()

	mojomFile := parser.GetMojomFile()
	comments := parser.GetComments()

	mojom.AttachCommentsToMojomFile(mojomFile, comments)
}

func TestOnlyComments(t *testing.T) {
	source := `
	// Hello world of comments
			`
	descriptor := mojom.NewMojomDescriptor()
	parser := MakeParser("TestOnlyComments", "TestOnlyComments", source, descriptor, nil)
	parser.Parse()

	mojomFile := parser.GetMojomFile()
	comments := parser.GetComments()

	mojom.AttachCommentsToMojomFile(mojomFile, comments)
}
