mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-05 18:21:16 +08:00
161 lines
4.6 KiB
Go
161 lines
4.6 KiB
Go
package parser
|
|
|
|
import (
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/wailsapp/wails/v3/internal/flags"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestGenerateModels(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
name string
|
|
dir string
|
|
want string
|
|
useInterface bool
|
|
useTypescript bool
|
|
}{
|
|
{
|
|
name: "function single",
|
|
dir: "testdata/function_single",
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "function from imported package",
|
|
dir: "testdata/function_from_imported_package",
|
|
want: getFile("testdata/function_from_imported_package/models.ts"),
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "function from imported package (Javascript)",
|
|
dir: "testdata/function_from_imported_package",
|
|
want: getFile("testdata/function_from_imported_package/models.js"),
|
|
},
|
|
{
|
|
name: "variable single",
|
|
dir: "testdata/variable_single",
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "variable single from function",
|
|
dir: "testdata/variable_single_from_function",
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "variable single from other function",
|
|
dir: "testdata/variable_single_from_other_function",
|
|
want: getFile("testdata/variable_single_from_other_function/models.ts"),
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "struct literal single",
|
|
dir: "testdata/struct_literal_single",
|
|
want: getFile("testdata/struct_literal_single/models.ts"),
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "struct literal multiple",
|
|
dir: "testdata/struct_literal_multiple",
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "struct literal multiple other",
|
|
dir: "testdata/struct_literal_multiple_other",
|
|
want: getFile("testdata/struct_literal_multiple_other/models.ts"),
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "struct literal multiple other (Javascript)",
|
|
dir: "testdata/struct_literal_multiple_other",
|
|
want: getFile("testdata/struct_literal_multiple_other/models.js"),
|
|
},
|
|
{
|
|
name: "struct literal non pointer single (Javascript)",
|
|
dir: "testdata/struct_literal_non_pointer_single",
|
|
want: getFile("testdata/struct_literal_non_pointer_single/models.ts"),
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "struct literal non pointer single (Javascript)",
|
|
dir: "testdata/struct_literal_non_pointer_single",
|
|
want: getFile("testdata/struct_literal_non_pointer_single/models.js"),
|
|
},
|
|
{
|
|
name: "struct literal multiple files",
|
|
dir: "testdata/struct_literal_multiple_files",
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "enum",
|
|
dir: "testdata/enum",
|
|
want: getFile("testdata/enum/models.ts"),
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "enum (Javascript)",
|
|
dir: "testdata/enum",
|
|
want: getFile("testdata/enum/models.js"),
|
|
},
|
|
{
|
|
name: "enum from imported package",
|
|
dir: "testdata/enum_from_imported_package",
|
|
want: getFile("testdata/enum_from_imported_package/models.ts"),
|
|
useTypescript: true,
|
|
},
|
|
{
|
|
name: "enum from imported package",
|
|
dir: "testdata/enum_from_imported_package",
|
|
want: getFile("testdata/enum_from_imported_package/models.js"),
|
|
useTypescript: false,
|
|
},
|
|
{
|
|
name: "enum interface",
|
|
dir: "testdata/enum-interface",
|
|
want: getFile("testdata/enum-interface/models.ts"),
|
|
useInterface: true,
|
|
useTypescript: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Run parser on directory
|
|
project, err := ParseProject(tt.dir)
|
|
if err != nil {
|
|
t.Fatalf("ParseProject() error = %v", err)
|
|
}
|
|
|
|
// Generate Models
|
|
got, err := GenerateModels(project.Models, project.Types, &flags.GenerateBindingsOptions{
|
|
UseInterfaces: tt.useInterface,
|
|
TS: tt.useTypescript,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("GenerateModels() error = %v", err)
|
|
}
|
|
// convert all line endings to \n
|
|
got = convertLineEndings(got)
|
|
want := convertLineEndings(tt.want)
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
gotFilename := "models.got.js"
|
|
if tt.useTypescript {
|
|
gotFilename = "models.got.ts"
|
|
}
|
|
err = os.WriteFile(filepath.Join(tt.dir, gotFilename), []byte(got), 0644)
|
|
if err != nil {
|
|
t.Errorf("os.WriteFile() error = %v", err)
|
|
return
|
|
}
|
|
t.Fatalf("GenerateModels() mismatch (-want +got):\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func convertLineEndings(str string) string {
|
|
// replace all \r\n with \n
|
|
return strings.ReplaceAll(str, "\r\n", "\n")
|
|
}
|