package option import ( "testing" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" ) 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[defs.ITxtFix]() if opt.IsSome() { sf.t.Fatalf("createNoneGood1(): is ok") } if !opt.IsNone() { sf.t.Fatalf("createNoneGood1(): not err") } if val := opt.SomeOr(defs.TxtFix("test2")); val.Get() != "test2" { sf.t.Fatalf("createNoneGood1(): val bad") } if val := opt.SomeOr(defs.TxtFix("test1")); val.Get() != "test1" { sf.t.Fatalf("createNoneGood1(): val bad") } if val := opt.SomeOrFn(sf.fnWrap2); val.Get() != "test5" { sf.t.Fatalf("createNoneGood1(): val bad") } _opt := opt.(*Option[defs.ITxtFix]) sf.unwrapErr(_opt) sf.hassert(_opt) sf.assert(_opt) } func (sf *testerOption) assert(res *Option[defs.ITxtFix]) { sf.t.Log("assert") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("assert(): panic==nil") } }() res.Hassert(testAssert) } var testAssert = defs.Txt("test assert") func (sf *testerOption) hassert(res *Option[defs.ITxtFix]) { sf.t.Log("hassert") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("hassert(): panic==nil") } }() res.Hassert(testAssert) } func (sf *testerOption) unwrapErr(res *Option[defs.ITxtFix]) { sf.t.Log("unwrapErr") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("unwrapErr(): panic==nil") } }() _ = res.Some() } var ( str = defs.TxtFix("test val") ) func (sf *testerOption) createSomeGood2() { sf.t.Log("createSomeGood2") defer func() { if _panic := recover(); _panic != nil { sf.t.Fatalf("createSomeGood2(): panic=%v", _panic) } }() opt := NewSome(str) if !opt.IsSome() { sf.t.Fatalf("createSomeGood2(): not ok") } if opt.IsNone() { sf.t.Fatalf("createSomeGood2(): is err") } if val := opt.Some(); val != str { sf.t.Fatalf("createSomeGood2(): val bad") } txtTest1 := defs.Txt("test1") if val := opt.SomeOr(txtTest1); val != str { sf.t.Fatalf("createSomeGood2(): val bad") } if val := opt.SomeOr(txtTest1); val.Get() != "str" { sf.t.Fatalf("createSomeGood2(): val bad") } if val := opt.SomeOrFn(sf.fnWrap); val != str { sf.t.Fatalf("createSomeGood2(): val bad") } opt.Hassert(txtTest) opt.Assert(txtTest) } var txtTest = defs.Txt("test") // Функция высшего порядка для замещения ошибки. func (sf *testerOption) fnWrap2() defs.ITxtFix { return defs.Txt("test5") } // Функция высшего порядка для замещения ошибки. func (sf *testerOption) fnWrap() defs.ITxtFix { return defs.Txt("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" _ = NewSome(&str) } // Нет результата. func (sf *testerOption) createSomeBad1() { sf.t.Log("createSomeBad1") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("createSomeBad1(): panic==nil") } }() var str defs.ITxtFix _ = NewSome(str) }