package option import ( "testing" . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes" ) type testerOption struct { t *testing.T } func TestOption(t *testing.T) { sf := &testerOption{ t: t, } sf.create() } // Создаёт новый Result. func (sf *testerOption) create() { sf.t.Log("create") sf.createSomeBad1() sf.createSomeGood1() sf.createSomeGood2() sf.createNoneGood1() } func (sf *testerOption) createNoneGood1() { sf.t.Log("createNoneGood1") defer func() { if _panic := recover(); _panic != nil { sf.t.Fatalf("createNoneGood1(): panic=%v", _panic) } }() opt := NewNone[string]() if opt.IsVal() { sf.t.Fatalf("createNoneGood1(): is ok") } if !opt.IsNone() { sf.t.Fatalf("createNoneGood1(): not err") } if val := opt.ValOr("test2"); val != "test2" { sf.t.Fatalf("createNoneGood1(): val bad") } if val := opt.ValOr("test1"); val != "test1" { sf.t.Fatalf("createNoneGood1(): val bad") } if val := opt.ValOrFn(sf.fnWrap2); val != "test5" { sf.t.Fatalf("createNoneGood1(): val bad") } sf.unwrapErr(opt) sf.hassert(opt) sf.assert(opt) } func (sf *testerOption) assert(res IOption[string]) { sf.t.Log("assert") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("assert(): panic==nil") } }() res.Hassert("test assert") } func (sf *testerOption) hassert(res IOption[string]) { sf.t.Log("hassert") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("hassert(): panic==nil") } }() res.Hassert("test hassert") } func (sf *testerOption) unwrapErr(res IOption[string]) { sf.t.Log("unwrapErr") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("unwrapErr(): panic==nil") } }() _ = res.Val() } const ( str = "test val" ) func (sf *testerOption) createSomeGood2() { sf.t.Log("createSomeGood2") defer func() { if _panic := recover(); _panic != nil { sf.t.Fatalf("createSomeGood2(): panic=%v", _panic) } }() res := NewOpt(str) if !res.IsVal() { sf.t.Fatalf("createSomeGood1(): not ok") } if res.IsNone() { sf.t.Fatalf("createSomeGood1(): is err") } if val := res.Val(); val != str { sf.t.Fatalf("createSomeGood1(): val bad") } if val := res.ValOr("test1"); val != str { sf.t.Fatalf("createSomeGood1(): val bad") } if val := res.ValOr("test1"); val != "str" { sf.t.Fatalf("createSomeGood1(): val bad") } if val := res.ValOrFn(sf.fnWrap); val != str { sf.t.Fatalf("createSomeGood1(): val bad") } res.Hassert("test") res.Assert("test") } // Функция высшего порядка для замещения ошибки. func (sf *testerOption) fnWrap2() string { return "test5" } // Функция высшего порядка для замещения ошибки. func (sf *testerOption) fnWrap() string { return "test1" } func (sf *testerOption) createSomeGood1() { sf.t.Log("createSomeGood1") defer func() { if _panic := recover(); _panic != nil { sf.t.Fatalf("createSomeGood1(): panic=%v", _panic) } }() str := "test val" _ = NewOpt(&str) } // Нет результата. func (sf *testerOption) createSomeBad1() { sf.t.Log("createSomeBad1") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("createSomeBad1(): panic==nil") } }() var str *string _ = NewOpt(str) }