github.com/sttk/sabi@v0.5.0/doc_test.go (about) 1 package sabi_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 9 "github.com/sttk/sabi" 10 ) 11 12 type GreetDax interface { 13 UserName() (string, sabi.Err) 14 Say(greeting string) sabi.Err 15 } 16 17 type ( // possible error reasons 18 NoName struct{} 19 FailToOutput struct{ Text string } 20 ) 21 22 func GreetLogic(dax GreetDax) sabi.Err { 23 name, err := dax.UserName() 24 if !err.IsOk() { 25 return err 26 } 27 return dax.Say("Hello, " + name) 28 } 29 30 type mapGreetDax struct { 31 m map[string]any 32 } 33 34 func (dax mapGreetDax) UserName() (string, sabi.Err) { 35 username, exists := dax.m["username"] 36 if !exists { 37 return "", sabi.NewErr(NoName{}) 38 } 39 return username.(string), sabi.Ok() 40 } 41 42 func (dax mapGreetDax) Say(greeting string) sabi.Err { 43 dax.m["greeting"] = greeting 44 return sabi.Ok() 45 } 46 47 func NewMapGreetDaxBase(m map[string]any) sabi.DaxBase { 48 base := sabi.NewDaxBase() 49 return struct { 50 sabi.DaxBase 51 mapGreetDax 52 }{ 53 DaxBase: base, 54 mapGreetDax: mapGreetDax{m: m}, 55 } 56 } 57 58 func TestGreetLogic_unitTest(t *testing.T) { 59 m := make(map[string]any) 60 base := NewMapGreetDaxBase(m) 61 62 m["username"] = "World" 63 err := sabi.RunTxn(base, GreetLogic) 64 assert.True(t, err.IsOk()) 65 assert.Equal(t, m["greeting"], "Hello, World") 66 } 67 68 var osArgs []string 69 70 type CliArgsUserDax struct { 71 } 72 73 func (dax CliArgsUserDax) UserName() (string, sabi.Err) { 74 if len(osArgs) <= 1 { 75 return "", sabi.NewErr(NoName{}) 76 } 77 return osArgs[1], sabi.Ok() 78 } 79 80 type ConsoleOutputDax struct { 81 } 82 83 func (dax ConsoleOutputDax) Say(text string) sabi.Err { 84 _, e := fmt.Println(text) 85 if e != nil { 86 return sabi.NewErr(FailToOutput{Text: text}, e) 87 } 88 return sabi.Ok() 89 } 90 91 func NewGreetDaxBase() sabi.DaxBase { 92 base := sabi.NewDaxBase() 93 return struct { 94 sabi.DaxBase 95 CliArgsUserDax 96 ConsoleOutputDax 97 }{ 98 DaxBase: base, 99 CliArgsUserDax: CliArgsUserDax{}, 100 ConsoleOutputDax: ConsoleOutputDax{}, 101 } 102 } 103 104 func TestGreetLogic_executingLogic(t *testing.T) { 105 osArgs = []string{"cmd", "Tom"} 106 base := NewGreetDaxBase() 107 err := sabi.RunTxn(base, GreetLogic) 108 assert.True(t, err.IsOk()) 109 } 110 111 type PrintDax interface { 112 Print() sabi.Err 113 } 114 115 type ConsoleOutputDax2 struct { 116 text string 117 } 118 119 func (dax *ConsoleOutputDax2) Say(text string) sabi.Err { 120 dax.text = text 121 return sabi.Ok() 122 } 123 func (dax *ConsoleOutputDax2) Print() sabi.Err { 124 _, e := fmt.Println(dax.text) 125 if e != nil { 126 return sabi.NewErr(FailToOutput{Text: dax.text}, e) 127 } 128 return sabi.Ok() 129 } 130 131 func NewGreetDaxBase2() sabi.DaxBase { 132 base := sabi.NewDaxBase() 133 return struct { 134 sabi.DaxBase 135 CliArgsUserDax 136 *ConsoleOutputDax2 137 }{ 138 DaxBase: base, 139 CliArgsUserDax: CliArgsUserDax{}, 140 ConsoleOutputDax2: &ConsoleOutputDax2{}, 141 } 142 } 143 144 func TestGreetLogic_MovingOutputs(t *testing.T) { 145 base := NewGreetDaxBase2() 146 err := sabi.RunTxn(base, GreetLogic) 147 assert.True(t, err.IsOk()) 148 err = sabi.RunTxn(base, func(dax PrintDax) sabi.Err { 149 return dax.Print() 150 }) 151 assert.True(t, err.IsOk()) 152 } 153 154 func TestGreetLogic_MovingOutputs2(t *testing.T) { 155 base := NewGreetDaxBase2() 156 txn0 := sabi.Txn(base, GreetLogic) 157 txn1 := sabi.Txn(base, func(dax PrintDax) sabi.Err { 158 return dax.Print() 159 }) 160 err := sabi.RunSeq(txn0, txn1) 161 assert.True(t, err.IsOk()) 162 }