浏览代码

Введение мок-объектов, тестов; 39.1%

SVI 3 年之前
父节点
当前提交
a024ca6e07

+ 4 - 0
libtui/v0/lib/cursor/cursor.go

@@ -22,6 +22,10 @@ func NewCursor(app types.IKernel) (*Cursor, error) {
 	if app == nil {
 		return nil, fmt.Errorf("NewCursor(): IScreen==nil")
 	}
+	strErr := app.Params()["cursor_err"]
+	if strErr != "" {
+		return nil, fmt.Errorf("NewCursor(): cursor_err not empty")
+	}
 	sf := &Cursor{
 		app:       app,
 		screen:    app.Screen(),

+ 11 - 4
libtui/v0/lib/kernel/kernel.go

@@ -20,10 +20,11 @@ import (
 // Kernel -- объектприложения
 type Kernel struct {
 	*tui_obj.TuiObj
-	screen   types.IScreen   // Объект приложения
-	cursor   types.ICursor   // Глобальный курсор
-	ctxBg    context.Context // Неотменяемый контекст ядра
-	ctx      context.Context // Контекст ядра
+	params   map[string]string // Параметры запуска ядра
+	screen   types.IScreen     // Объект приложения
+	cursor   types.ICursor     // Глобальный курсор
+	ctxBg    context.Context   // Неотменяемый контекст ядра
+	ctx      context.Context   // Контекст ядра
 	fnCancel func()
 	lstDraw  *lst_drawer.LstDrawer // Список объектов для отрисовки
 }
@@ -38,6 +39,7 @@ func NewKernel(params map[string]string) (*Kernel, error) {
 	ctx, fnCancel := context.WithCancel(ctxBg)
 	sf := &Kernel{
 		TuiObj:   tui_obj.NewTuiObj(),
+		params:   params,
 		ctxBg:    ctxBg,
 		ctx:      ctx,
 		fnCancel: fnCancel,
@@ -122,3 +124,8 @@ func (sf *Kernel) Draw() {
 	sf.lstDraw.Draw()
 	sf.cursor.Draw()
 }
+
+// Params -- возвращает параметры ядра
+func (sf *Kernel) Params() map[string]string {
+	return sf.params
+}

+ 10 - 3
libtui/v0/lib/screen/screen.go

@@ -31,9 +31,16 @@ func NewScreen(app types.IKernel) (*Screen, error) {
 	if app == nil {
 		return nil, fmt.Errorf("NewScreen(): IApp==nil")
 	}
-	scr, err := tcell.NewScreen()
-	if err != nil {
-		return nil, fmt.Errorf("NewScreen(): in create tcell.Screen, err=\n\t%w", err)
+	isTest := app.Params()["screen_test"]
+	var (
+		scr tcell.Screen
+		err error
+	)
+	if isTest == "" {
+		scr, err = tcell.NewScreen()
+		if err != nil {
+			return nil, fmt.Errorf("NewScreen(): in create tcell.Screen, err=\n\t%w", err)
+		}
 	}
 	sf := &Screen{
 		kern:     app,

+ 9 - 2
libtui/v0/lib/screen/screen_test.go

@@ -3,13 +3,14 @@ package screen
 import (
 	"testing"
 
+	"p78git.ddns.net/svi/libtui/mock/mock_kernel"
 	"p78git.ddns.net/svi/libtui/types"
 )
 
 // Тестер для экрана
 type tester struct {
 	t    *testing.T
-	app  types.IKernel
+	kern types.IKernel
 	scr  *Screen
 	iscr types.IScreen
 	err  error
@@ -25,7 +26,13 @@ func TestScreen(t *testing.T) {
 // Создание экрана
 func (sf *tester) create() {
 	sf.t.Logf("create")
-	sf.scr, sf.err = NewScreen(sf.app)
+	params := make(map[string]string)
+	params["screen_test"] = "true"
+	sf.kern, sf.err = mock_kernel.NewMockKernel(params)
+	if sf.err != nil {
+		sf.t.Fatalf("create(): err=\n\t%v", sf.err)
+	}
+	sf.scr, sf.err = NewScreen(sf.kern)
 	if sf.err != nil {
 		sf.t.Fatalf("create(): err=\n\t%v", sf.err)
 	}

+ 121 - 0
libtui/v0/mock/mock_kernel/mock_kernel.go

@@ -0,0 +1,121 @@
+// package mock_kernel -- мок-ядро библиотеки
+package mock_kernel
+
+import (
+	"context"
+	"fmt"
+
+	"p78git.ddns.net/svi/libtui/alias"
+	"p78git.ddns.net/svi/libtui/lib/color"
+	"p78git.ddns.net/svi/libtui/lib/cursor"
+	"p78git.ddns.net/svi/libtui/lib/kernel/lst_drawer"
+	"p78git.ddns.net/svi/libtui/lib/line"
+	"p78git.ddns.net/svi/libtui/lib/pos"
+	"p78git.ddns.net/svi/libtui/lib/tui_obj"
+	"p78git.ddns.net/svi/libtui/types"
+)
+
+// MockKernel -- мок-ядро библиотеки
+//
+//	 ВНИМАНИЕ!!!
+//		Screen_ -- присваивать руками
+type MockKernel struct {
+	*tui_obj.TuiObj
+	Params_  map[string]string
+	ctxBg    context.Context // Неотменяемый контекст
+	ctx      context.Context // Отменяесый контекст
+	fnCancel func()          // Функция отмены контекста
+	Screen_  types.IScreen   // Объект приложения
+	Cursor_  *cursor.Cursor
+	lstDraw  *lst_drawer.LstDrawer // Список объектов для отрисовки
+}
+
+// NewMockKernel -- возвращаетновое мок-ядро
+func NewMockKernel(params map[string]string) (*MockKernel, error) {
+	if params == nil {
+		params = make(map[string]string)
+	}
+	strErr := params["kern_err"]
+	if strErr != "" {
+		return nil, fmt.Errorf("NewMockKernel(): kern_err not empty")
+	}
+	ctxBg := context.Background()
+	ctx, fn := context.WithCancel(ctxBg)
+	sf := &MockKernel{
+		Params_:  params,
+		ctxBg:    ctxBg,
+		fnCancel: fn,
+		ctx:      ctx,
+	}
+	_ = types.IKernel(sf)
+	var err error
+	sf.Cursor_, err = cursor.NewCursor(sf)
+	if err != nil {
+		return nil, fmt.Errorf("NewMockKernel(): in create ICursor, err=\n\t%w", err)
+	}
+	return sf, nil
+}
+
+// Run -- запускает объект приложения в работу
+func (sf *MockKernel) Run() error {
+	sf.Screen_.Run()
+	<-sf.ctx.Done()
+	return nil
+}
+
+// Screen -- возвращает объект экрана
+func (sf *MockKernel) Screen() types.IScreen {
+	return sf.Screen_
+}
+
+// CancelApp -- отменяет контекст ядра
+func (sf *MockKernel) CancelApp() {
+	sf.fnCancel()
+}
+
+// Ctx -- возвращает контекст ядра
+func (sf *MockKernel) Ctx() context.Context {
+	return sf.ctx
+}
+
+// Cursor -- возвращает курсор приложения
+func (sf *MockKernel) Cursor() types.ICursor {
+	return sf.Cursor_
+}
+
+// Draw -- отрисовывает приложение
+func (sf *MockKernel) Draw() {
+	sf.lstDraw.Draw()
+	sf.Cursor_.Draw()
+}
+
+// MakeLine -- создаёт новую линию
+func (sf *MockKernel) MakeLine(beg, end types.IPos, color types.IColor) (types.ILine, error) {
+	line, err := line.NewLine(sf, beg, end, color)
+	if err != nil {
+		return nil, fmt.Errorf("MockKernel.MakeLine(); in make ILine, err=\n\t%w", err)
+	}
+	if err := sf.lstDraw.Add(line); err != nil {
+		return nil, fmt.Errorf("MockKernel.MakeLine(); in add ILine to LstDrawer, err=\n\t%w", err)
+	}
+	return line, nil
+}
+
+// MakePos -- создаёт новую позицию
+func (sf *MockKernel) MakePos(posX alias.PosX, posY alias.PosY) types.IPos {
+	pos := pos.NewPos()
+	pos.Set(posX, posY)
+	return pos
+}
+
+// MakeColor -- создаёт новый цвет
+func (sf *MockKernel) MakeColor(r, g, b uint8) types.IColor {
+	color := color.NewColor()
+	color.Set(r, g, b)
+	return color
+}
+
+// Params -- возвращает словарь параметров
+func (sf *MockKernel) Params() map[string]string {
+	return sf.Params_
+}

+ 101 - 0
libtui/v0/mock/mock_kernel/mock_kernel_test.go

@@ -0,0 +1,101 @@
+package mock_kernel
+
+import (
+	"testing"
+
+	"p78git.ddns.net/svi/libtui/types"
+)
+
+/*
+	Тест для мок-ядра
+*/
+
+// Тестер для мок-ядра
+type tester struct {
+	t     *testing.T
+	kern  *MockKernel
+	ikern types.IKernel
+	err   error
+}
+
+func TestMockKernel(t *testing.T) {
+	test := &tester{
+		t: t,
+	}
+	test.create()
+	test.screen()
+	test.ctx()
+}
+
+// Проверка контекста
+func (sf *tester) ctx() {
+	sf.t.Logf("ctx")
+	sf.t.Logf("ctx")
+	if ctx := sf.ikern.Ctx(); ctx == nil {
+		sf.t.Fatalf("ctx(): ctx==nil")
+	}
+}
+
+// Проверка экрана
+func (sf *tester) screen() {
+	scr := sf.ikern.Screen()
+	if scr != nil {
+		sf.t.Fatalf("screen(): scr!=nil")
+	}
+}
+
+// Создание ядра
+func (sf *tester) create() {
+	sf.t.Logf("create")
+	sf.createBad1()
+	sf.createBad2()
+	sf.createGood0()
+	sf.createGood()
+}
+
+func (sf *tester) createGood() {
+	sf.t.Logf("createGood")
+	params := make(map[string]string)
+	sf.kern, sf.err = NewMockKernel(params)
+	sf.ikern = sf.kern
+}
+
+// Пустой список параметров
+func (sf *tester) createGood0() {
+	sf.t.Logf("createGood0")
+	sf.kern, sf.err = NewMockKernel(nil)
+	if sf.err != nil {
+		sf.t.Fatalf("createGood0(): err=%v", sf.err)
+	}
+	if sf.kern == nil {
+		sf.t.Fatalf("createGood0(): kernel==nil")
+	}
+}
+
+// Параметр сбояпри создании курсора
+func (sf *tester) createBad2() {
+	sf.t.Logf("createBad2")
+	params := make(map[string]string)
+	params["cursor_err"] = "true"
+	sf.kern, sf.err = NewMockKernel(params)
+	if sf.err == nil {
+		sf.t.Fatalf("createBad2(): err==nil")
+	}
+	if sf.kern != nil {
+		sf.t.Fatalf("createBad2(): kernel!=nil")
+	}
+}
+
+// Параметр сбоя при создании ядра
+func (sf *tester) createBad1() {
+	sf.t.Logf("createBad1")
+	params := make(map[string]string)
+	params["kern_err"] = "true"
+	sf.kern, sf.err = NewMockKernel(params)
+	if sf.err == nil {
+		sf.t.Fatalf("createBad1(): err==nil")
+	}
+	if sf.kern != nil {
+		sf.t.Fatalf("createBad1(): kernel!=nil")
+	}
+}

+ 52 - 0
libtui/v0/mock/mock_screen/mock_screen_test.go

@@ -0,0 +1,52 @@
+package mock_screen
+
+import (
+	"testing"
+
+	"p78git.ddns.net/svi/libtui/mock/mock_kernel"
+)
+
+/*
+	Тест для мок-экрана
+*/
+
+// Тестер мок-экрана
+type tester struct {
+	t    *testing.T
+	kern *mock_kernel.MockKernel
+	err  error
+}
+
+func TestMockScreen(t *testing.T) {
+	test := &tester{
+		t: t,
+	}
+	test.create()
+}
+
+// Создание экрана
+func (sf *tester) create() {
+	sf.t.Logf("create")
+	sf.createBad1()
+	sf.createGood1()
+}
+
+func (sf *tester) createGood1() {
+	sf.t.Logf("createGood1")
+	sf.kern, sf.err = mock_kernel.NewMockKernel(nil)
+	if sf.err != nil {
+		sf.t.Fatalf("createGood1(): err=%v", sf.err)
+	}
+}
+
+// Нет объекта приложения
+func (sf *tester) createBad1() {
+	sf.t.Logf("createBad1")
+	scr, err := NewMockScreen(nil)
+	if err == nil {
+		sf.t.Fatalf("createBad1(): err==nil")
+	}
+	if scr != nil {
+		sf.t.Fatalf("createBad1(): screen!=nil")
+	}
+}

+ 2 - 0
libtui/v0/types/ikernel.go

@@ -9,6 +9,8 @@ import (
 // IKernel -- объект ядра
 type IKernel interface {
 	IDrawer
+	// Params -- список параметров ядра
+	Params() map[string]string
 	// Screen -- объект экрана
 	Screen() IScreen
 	// Run -- запускает объект ядра в работу