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