108 lines
2.6 KiB
Go
108 lines
2.6 KiB
Go
package integration
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/marte-dev/marte-dev-tools/internal/formatter"
|
|
"github.com/marte-dev/marte-dev-tools/internal/index"
|
|
"github.com/marte-dev/marte-dev-tools/internal/parser"
|
|
"github.com/marte-dev/marte-dev-tools/internal/validator"
|
|
)
|
|
|
|
func TestCheckCommand(t *testing.T) {
|
|
inputFile := "integration/error.marte"
|
|
content, err := ioutil.ReadFile(inputFile)
|
|
if err != nil {
|
|
t.Fatalf("Failed to read %s: %v", inputFile, err)
|
|
}
|
|
|
|
p := parser.NewParser(string(content))
|
|
config, err := p.Parse()
|
|
if err != nil {
|
|
t.Fatalf("Parse failed: %v", err)
|
|
}
|
|
|
|
idx := index.NewIndex()
|
|
idx.IndexConfig(inputFile, config)
|
|
idx.ResolveReferences()
|
|
|
|
v := validator.NewValidator(idx)
|
|
v.Validate(inputFile, config)
|
|
v.CheckUnused()
|
|
|
|
foundError := false
|
|
for _, diag := range v.Diagnostics {
|
|
if strings.Contains(diag.Message, "must contain a 'Class' field") {
|
|
foundError = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !foundError {
|
|
t.Errorf("Expected 'Class' field error in %s, but found none", inputFile)
|
|
}
|
|
}
|
|
|
|
func TestFmtCommand(t *testing.T) {
|
|
inputFile := "integration/fmt.marte"
|
|
content, err := ioutil.ReadFile(inputFile)
|
|
if err != nil {
|
|
t.Fatalf("Failed to read %s: %v", inputFile, err)
|
|
}
|
|
|
|
p := parser.NewParser(string(content))
|
|
config, err := p.Parse()
|
|
if err != nil {
|
|
t.Fatalf("Parse failed: %v", err)
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
formatter.Format(config, &buf)
|
|
|
|
output := buf.String()
|
|
|
|
// Check for indentation
|
|
if !strings.Contains(output, " Class = \"MyClass\"") {
|
|
t.Error("Expected 2-space indentation for Class field")
|
|
}
|
|
|
|
// Check for sticky comments (no blank line between comment and field)
|
|
// We expect:
|
|
// // Sticky comment
|
|
// Field = 123
|
|
if !strings.Contains(output, " // Sticky comment\n Field = 123") {
|
|
t.Errorf("Expected sticky comment to be immediately followed by field, got:\n%s", output)
|
|
}
|
|
|
|
if !strings.Contains(output, "Array = { 1 2 3 }") {
|
|
t.Errorf("Expected formatted array '{ 1 2 3 }', got: %s", output)
|
|
}
|
|
|
|
// Check for inline comments
|
|
inputFile2 := "integration/fmt_inline.marte"
|
|
content2, err := ioutil.ReadFile(inputFile2)
|
|
if err != nil {
|
|
t.Fatalf("Failed to read %s: %v", inputFile2, err)
|
|
}
|
|
|
|
p2 := parser.NewParser(string(content2))
|
|
config2, err := p2.Parse()
|
|
if err != nil {
|
|
t.Fatalf("Parse failed: %v", err)
|
|
}
|
|
|
|
var buf2 bytes.Buffer
|
|
formatter.Format(config2, &buf2)
|
|
output2 := buf2.String()
|
|
|
|
if !strings.Contains(output2, "+Node = { // Comment after open brace") {
|
|
t.Error("Expected inline comment after open brace")
|
|
}
|
|
if !strings.Contains(output2, "Field1 = \"Value\" // Comment after value") {
|
|
t.Error("Expected inline comment after field value")
|
|
}
|
|
}
|