@@ -96,3 +96,135 @@ func TestSinkOnOkContinuationCall(t *testing.T) {
9696 require .True (t , called )
9797 require .Nil (t , res )
9898}
99+
100+ var errFlatMap = errors .New ("fail" )
101+ var errFlatMapOrig = errors .New ("original" )
102+
103+ var flatMapTestCases = []struct {
104+ name string
105+ input Result [int ]
106+ fnA func (int ) Result [int ]
107+ fnB func (int ) Result [string ]
108+ expectedA Result [int ]
109+ expectedB Result [string ]
110+ }{
111+ {
112+ name : "Ok to Ok" ,
113+ input : Ok (1 ),
114+ fnA : func (i int ) Result [int ] { return Ok (i + 1 ) },
115+ fnB : func (i int ) Result [string ] {
116+ return Ok (fmt .Sprintf ("%d" , i + 1 ))
117+ },
118+ expectedA : Ok (2 ),
119+ expectedB : Ok ("2" ),
120+ },
121+ {
122+ name : "Ok to Err" ,
123+ input : Ok (1 ),
124+ fnA : func (i int ) Result [int ] {
125+ return Err [int ](errFlatMap )
126+ },
127+ fnB : func (i int ) Result [string ] {
128+ return Err [string ](errFlatMap )
129+ },
130+ expectedA : Err [int ](errFlatMap ),
131+ expectedB : Err [string ](errFlatMap ),
132+ },
133+ {
134+ name : "Err to Err (function not called)" ,
135+ input : Err [int ](errFlatMapOrig ),
136+ fnA : func (i int ) Result [int ] { return Ok (i + 1 ) },
137+ fnB : func (i int ) Result [string ] {
138+ return Ok ("should not happen" )
139+ },
140+ expectedA : Err [int ](errFlatMapOrig ),
141+ expectedB : Err [string ](errFlatMapOrig ),
142+ },
143+ }
144+
145+ var orElseTestCases = []struct {
146+ name string
147+ input Result [int ]
148+ fn func (error ) Result [int ]
149+ expected Result [int ]
150+ }{
151+ {
152+ name : "Ok to Ok (function not called)" ,
153+ input : Ok (1 ),
154+ fn : func (err error ) Result [int ] { return Ok (2 ) },
155+ expected : Ok (1 ),
156+ },
157+ {
158+ name : "Err to Ok" ,
159+ input : Err [int ](errFlatMapOrig ),
160+ fn : func (err error ) Result [int ] { return Ok (2 ) },
161+ expected : Ok (2 ),
162+ },
163+ {
164+ name : "Err to Err" ,
165+ input : Err [int ](errFlatMapOrig ),
166+ fn : func (err error ) Result [int ] {
167+ return Err [int ](errFlatMap )
168+ },
169+ expected : Err [int ](errFlatMap ),
170+ },
171+ }
172+
173+ func TestFlatMap (t * testing.T ) {
174+ for _ , tc := range flatMapTestCases {
175+ tc := tc
176+ t .Run (tc .name , func (t * testing.T ) {
177+ t .Parallel ()
178+ actual := tc .input .FlatMap (tc .fnA )
179+ require .Equal (t , tc .expectedA , actual )
180+ })
181+ }
182+ }
183+
184+ func TestAndThenMethod (t * testing.T ) {
185+ // Since AndThen is just an alias for FlatMap, we can reuse the same
186+ // test cases.
187+ for _ , tc := range flatMapTestCases {
188+ tc := tc
189+ t .Run (tc .name , func (t * testing.T ) {
190+ t .Parallel ()
191+ actual := tc .input .AndThen (tc .fnA )
192+ require .Equal (t , tc .expectedA , actual )
193+ })
194+ }
195+ }
196+
197+ func TestOrElseMethod (t * testing.T ) {
198+ for _ , tc := range orElseTestCases {
199+ tc := tc
200+ t .Run (tc .name , func (t * testing.T ) {
201+ t .Parallel ()
202+ actual := tc .input .OrElse (tc .fn )
203+ require .Equal (t , tc .expected , actual )
204+ })
205+ }
206+ }
207+
208+ func TestFlatMapResult (t * testing.T ) {
209+ for _ , tc := range flatMapTestCases {
210+ tc := tc
211+ t .Run (tc .name , func (t * testing.T ) {
212+ t .Parallel ()
213+ actual := FlatMapResult (tc .input , tc .fnB )
214+ require .Equal (t , tc .expectedB , actual )
215+ })
216+ }
217+ }
218+
219+ func TestAndThenFunc (t * testing.T ) {
220+ // Since AndThen is just an alias for FlatMapResult, we can reuse the
221+ // same test cases.
222+ for _ , tc := range flatMapTestCases {
223+ tc := tc
224+ t .Run (tc .name , func (t * testing.T ) {
225+ t .Parallel ()
226+ actual := AndThen (tc .input , tc .fnB )
227+ require .Equal (t , tc .expectedB , actual )
228+ })
229+ }
230+ }
0 commit comments