Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,35 @@
package binding_test

import (
"io/fs"
"os"
"testing"

"github.com/wailsapp/wails/v2/internal/binding"
"github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/float_package"
"github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/int_package"
"github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/map_package"
"github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/uint_package"
"github.com/wailsapp/wails/v2/internal/logger"
)

const expectedBindings = `// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
type HandlerTest struct{}

func (h *HandlerTest) StartingWithInt(_ int_package.SomeStruct) {}
func (h *HandlerTest) StartingWithFloat(_ float_package.SomeStruct) {}
func (h *HandlerTest) StartingWithUint(_ uint_package.SomeStruct) {}
func (h *HandlerTest) StartingWithMap(_ map_package.SomeStruct) {}

func (h *HandlerTest) Get() HandlerTest {
return *h
}

var ConflictingPackageNameTest = BindingTest{
name: "ConflictingPackageNameTest",
structs: []interface{}{
&HandlerTest{},
&float_package.SomeStruct{},
&int_package.SomeStruct{},
&map_package.SomeStruct{},
&uint_package.SomeStruct{},
},
exemptions: nil,
shouldError: false,
want: `// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import {float_package} from '../models';
import {int_package} from '../models';
Expand All @@ -27,38 +43,5 @@ export function StartingWithInt(arg1:int_package.SomeStruct):Promise<void>;
export function StartingWithMap(arg1:map_package.SomeStruct):Promise<void>;

export function StartingWithUint(arg1:uint_package.SomeStruct):Promise<void>;
`

type HandlerTest struct{}

func (h *HandlerTest) StartingWithInt(_ int_package.SomeStruct) {}
func (h *HandlerTest) StartingWithFloat(_ float_package.SomeStruct) {}
func (h *HandlerTest) StartingWithUint(_ uint_package.SomeStruct) {}
func (h *HandlerTest) StartingWithMap(_ map_package.SomeStruct) {}

func TestConflictingPackageName(t *testing.T) {
// given
generationDir := t.TempDir()

// setup
testLogger := &logger.Logger{}
b := binding.NewBindings(testLogger, []interface{}{&HandlerTest{}}, []interface{}{}, false, []interface{}{})

// then
err := b.GenerateGoBindings(generationDir)
if err != nil {
t.Fatalf("could not generate the Go bindings: %v", err)
}

// then
rawGeneratedBindings, err := fs.ReadFile(os.DirFS(generationDir), "binding_test/HandlerTest.d.ts")
if err != nil {
t.Fatalf("could not read the generated bindings: %v", err)
}

// then
generatedBindings := string(rawGeneratedBindings)
if generatedBindings != expectedBindings {
t.Fatalf("the generated bindings does not match the expected ones.\nWanted:\n%s\n\nGot:\n%s", expectedBindings, generatedBindings)
}
`,
}
41 changes: 41 additions & 0 deletions v2/internal/binding/binding_test/binding_custom_type_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package binding_test

import (
"time"

"github.com/google/uuid"
)

type CustomTypeStruct struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"createdAt"`
}

func (s CustomTypeStruct) Get() CustomTypeStruct {
return s
}

var CustomTypeGenerationTest = BindingTest{
name: "CustomTypeGenerationTest",
structs: []interface{}{
&CustomTypeStruct{},
},
exemptions: nil,
shouldError: false,
want: `
export namespace binding_test {
export class CustomTypeStruct {
id: string;
createdAt: string;
static createFrom(source: any = {}) {
return new CustomTypeStruct(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.id = source["id"];
this.createdAt = source["createdAt"];
}
}
}
`,
}
91 changes: 35 additions & 56 deletions v2/internal/binding/binding_test/binding_returned_promises_test.go
Original file line number Diff line number Diff line change
@@ -1,49 +1,19 @@
package binding_test

import (
"io/fs"
"os"
"testing"

"github.com/wailsapp/wails/v2/internal/binding"
"github.com/wailsapp/wails/v2/internal/logger"
)

const expectedPromiseBindings = `// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import {binding_test} from '../models';

export function ErrorReturn(arg1:number):Promise<void>;

export function NoReturn(arg1:string):Promise<void>;

export function SingleReturn(arg1:any):Promise<number>;

export function SingleReturnStruct(arg1:any):Promise<binding_test.PromisesTestReturnStruct>;

export function SingleReturnStructPointer(arg1:any):Promise<binding_test.PromisesTestReturnStruct>;

export function SingleReturnStructPointerSlice(arg1:any):Promise<Array<binding_test.PromisesTestReturnStruct>>;

export function SingleReturnStructSlice(arg1:any):Promise<Array<binding_test.PromisesTestReturnStruct>>;

export function SingleReturnWithError(arg1:number):Promise<string>;

export function TwoReturn(arg1:any):Promise<string|number>;
`

// Define the Go types to be tested
type PromisesTest struct{}
type PromisesTestReturnStruct struct{}

// Methods returning different types to exercise promise handling
func (h *PromisesTest) NoReturn(_ string) {}
func (h *PromisesTest) ErrorReturn(_ int) error { return nil }
func (h *PromisesTest) SingleReturn(_ interface{}) int { return 0 }
func (h *PromisesTest) SingleReturnStructPointer(_ interface{}) *PromisesTestReturnStruct {
return &PromisesTestReturnStruct{}
}
func (h *PromisesTest) SingleReturnStruct(_ interface{}) PromisesTestReturnStruct {
return PromisesTestReturnStruct{}
}
func (h *PromisesTest) SingleReturnStructPointer(_ interface{}) *PromisesTestReturnStruct {
return &PromisesTestReturnStruct{}
}
func (h *PromisesTest) SingleReturnStructSlice(_ interface{}) []PromisesTestReturnStruct {
return []PromisesTestReturnStruct{}
}
Expand All @@ -53,29 +23,38 @@ func (h *PromisesTest) SingleReturnStructPointerSlice(_ interface{}) []*Promises
func (h *PromisesTest) SingleReturnWithError(_ int) (string, error) { return "", nil }
func (h *PromisesTest) TwoReturn(_ interface{}) (string, int) { return "", 0 }

func TestPromises(t *testing.T) {
// given
generationDir := t.TempDir()
// Optional Get() method for consistency with other tests
func (h *PromisesTest) Get() PromisesTest { return *h }

// The test definition recognized by TestBindings_GenerateModels
var PromisesBindingTest = BindingTest{
name: "PromisesBindingTest",
structs: []interface{}{
&PromisesTest{},
&PromisesTestReturnStruct{},
},
exemptions: nil,
shouldError: false,
want: `// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import {binding_test} from '../models';

export function ErrorReturn(arg1:number):Promise<void>;

export function NoReturn(arg1:string):Promise<void>;

export function SingleReturn(arg1:any):Promise<number>;

// setup
testLogger := &logger.Logger{}
b := binding.NewBindings(testLogger, []interface{}{&PromisesTest{}}, []interface{}{}, false, []interface{}{})
export function SingleReturnStruct(arg1:any):Promise<binding_test.PromisesTestReturnStruct>;

// then
err := b.GenerateGoBindings(generationDir)
if err != nil {
t.Fatalf("could not generate the Go bindings: %v", err)
}
export function SingleReturnStructPointer(arg1:any):Promise<binding_test.PromisesTestReturnStruct>;

// then
rawGeneratedBindings, err := fs.ReadFile(os.DirFS(generationDir), "binding_test/PromisesTest.d.ts")
if err != nil {
t.Fatalf("could not read the generated bindings: %v", err)
}
export function SingleReturnStructPointerSlice(arg1:any):Promise<Array<binding_test.PromisesTestReturnStruct>>;

// then
generatedBindings := string(rawGeneratedBindings)
if generatedBindings != expectedPromiseBindings {
t.Fatalf("the generated bindings does not match the expected ones.\nWanted:\n%s\n\nGot:\n%s", expectedPromiseBindings, generatedBindings)
}
export function SingleReturnStructSlice(arg1:any):Promise<Array<binding_test.PromisesTestReturnStruct>>;

export function SingleReturnWithError(arg1:number):Promise<string>;

export function TwoReturn(arg1:any):Promise<string|number>;
`,
}
73 changes: 29 additions & 44 deletions v2/internal/binding/binding_test/binding_type_alias_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,36 @@ package binding_test

import (
"github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/int_package"
"io/fs"
"os"
"testing"

"github.com/wailsapp/wails/v2/internal/binding"
"github.com/wailsapp/wails/v2/internal/logger"
)

const expectedTypeAliasBindings = `// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
type AliasTest struct{}
type MapAlias map[string]string

func (h *AliasTest) Map() map[string]string { return nil }
func (h *AliasTest) MapAlias() MapAlias { return nil }
func (h *AliasTest) MapWithImportedStructValue() map[string]int_package.SomeStruct {
return nil
}
func (h *AliasTest) Slice() []string { return nil }
func (h *AliasTest) SliceImportedStruct() []int_package.SomeStruct {
return nil
}

// Optional, to match other canonical binding tests
func (h *AliasTest) Get() AliasTest {
return *h
}

var TypeAliasTest = BindingTest{
name: "TypeAliasTest",
structs: []interface{}{
&AliasTest{},
&MapAlias{},
&int_package.SomeStruct{},
},
exemptions: nil,
shouldError: false,
want: `// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import {binding_test} from '../models';
import {int_package} from '../models';
Expand All @@ -24,41 +45,5 @@ export function MapWithImportedStructValue():Promise<Record<string, int_package.
export function Slice():Promise<Array<string>>;

export function SliceImportedStruct():Promise<Array<int_package.SomeStruct>>;
`

type AliasTest struct{}
type MapAlias map[string]string

func (h *AliasTest) Map() map[string]string { return nil }
func (h *AliasTest) MapAlias() MapAlias { return nil }
func (h *AliasTest) MapWithImportedStructValue() map[string]int_package.SomeStruct { return nil }
func (h *AliasTest) Slice() []string { return nil }
func (h *AliasTest) SliceImportedStruct() []int_package.SomeStruct { return nil }

func TestAliases(t *testing.T) {
// given
generationDir := t.TempDir()

// setup
testLogger := &logger.Logger{}
b := binding.NewBindings(testLogger, []interface{}{&AliasTest{}}, []interface{}{}, false, []interface{}{})

// then
err := b.GenerateGoBindings(generationDir)
if err != nil {
t.Fatalf("could not generate the Go bindings: %v", err)
}

// then
rawGeneratedBindings, err := fs.ReadFile(os.DirFS(generationDir), "binding_test/AliasTest.d.ts")
if err != nil {
t.Fatalf("could not read the generated bindings: %v", err)
}

// then
generatedBindings := string(rawGeneratedBindings)
if generatedBindings != expectedTypeAliasBindings {
t.Fatalf("the generated bindings does not match the expected ones.\nWanted:\n%s\n\nGot:\n%s", expectedTypeAliasBindings,
generatedBindings)
}
`,
}
Loading
Loading