diff options
Diffstat (limited to 'systray_windows_test.go')
| -rw-r--r-- | systray_windows_test.go | 132 | 
1 files changed, 132 insertions, 0 deletions
| diff --git a/systray_windows_test.go b/systray_windows_test.go new file mode 100644 index 0000000..7cb6c75 --- /dev/null +++ b/systray_windows_test.go @@ -0,0 +1,132 @@ +// +build windows + +package systray + +import ( +	"io/ioutil" +	"runtime" +	"sync/atomic" +	"testing" +	"time" +	"unsafe" + +	"golang.org/x/sys/windows" +) + +const iconFilePath = "example/icon/iconwin.ico" + +func TestBaseWindowsTray(t *testing.T) { +	systrayReady = func() {} +	systrayExit = func() {} + +	runtime.LockOSThread() + +	if err := wt.initInstance(); err != nil { +		t.Fatalf("initInstance failed: %s", err) +	} + +	if err := wt.createMenu(); err != nil { +		t.Fatalf("createMenu failed: %s", err) +	} + +	defer func() { +		pDestroyWindow.Call(uintptr(wt.window)) +		wt.wcex.unregister() +	}() + +	if err := wt.setIcon(iconFilePath); err != nil { +		t.Errorf("SetIcon failed: %s", err) +	} + +	if err := wt.setTooltip("Cyrillic tooltip тест:)"); err != nil { +		t.Errorf("SetIcon failed: %s", err) +	} + +	var id int32 = 0 +	err := wt.addOrUpdateMenuItem(atomic.AddInt32(&id, 1), "Simple enabled", false, false) +	if err != nil { +		t.Errorf("mergeMenuItem failed: %s", err) +	} +	err = wt.addOrUpdateMenuItem(atomic.AddInt32(&id, 1), "Simple disabled", true, false) +	if err != nil { +		t.Errorf("mergeMenuItem failed: %s", err) +	} +	err = wt.addSeparatorMenuItem(atomic.AddInt32(&id, 1)) +	if err != nil { +		t.Errorf("addSeparatorMenuItem failed: %s", err) +	} +	err = wt.addOrUpdateMenuItem(atomic.AddInt32(&id, 1), "Simple checked enabled", false, true) +	if err != nil { +		t.Errorf("mergeMenuItem failed: %s", err) +	} +	err = wt.addOrUpdateMenuItem(atomic.AddInt32(&id, 1), "Simple checked disabled", true, true) +	if err != nil { +		t.Errorf("mergeMenuItem failed: %s", err) +	} + +	err = wt.hideMenuItem(1) +	if err != nil { +		t.Errorf("hideMenuItem failed: %s", err) +	} + +	err = wt.hideMenuItem(100) +	if err == nil { +		t.Error("hideMenuItem failed: must return error on invalid item id") +	} + +	err = wt.addOrUpdateMenuItem(2, "Simple disabled update", true, false) +	if err != nil { +		t.Errorf("mergeMenuItem failed: %s", err) +	} + +	time.AfterFunc(1*time.Second, quit) + +	m := struct { +		WindowHandle windows.Handle +		Message      uint32 +		Wparam       uintptr +		Lparam       uintptr +		Time         uint32 +		Pt           point +	}{} +	for { +		ret, _, err := pGetMessage.Call(uintptr(unsafe.Pointer(&m)), 0, 0, 0) +		res := int32(ret) +		if res == -1 { +			t.Errorf("win32 GetMessage failed: %v", err) +			return +		} else if res == 0 { +			break +		} +		pTranslateMessage.Call(uintptr(unsafe.Pointer(&m))) +		pDispatchMessage.Call(uintptr(unsafe.Pointer(&m))) +	} +} + +func TestWindowsRun(t *testing.T) { +	onReady := func() { +		b, err := ioutil.ReadFile(iconFilePath) +		if err != nil { +			t.Fatalf("Can't load icon file: %v", err) +		} +		SetIcon(b) +		SetTitle("Test title с кириллицей") + +		bSomeBtn := AddMenuItem("Йа кнопко", "") +		bSomeBtn.Check() +		AddSeparator() +		bQuit := AddMenuItem("Quit", "Quit the whole app") +		go func() { +			<-bQuit.ClickedCh +			t.Log("Quit reqested") +			Quit() +		}() +		time.AfterFunc(1*time.Second, Quit) +	} + +	onExit := func() { +		t.Log("Exit success") +	} + +	Run(onReady, onExit) +} | 
