| 1 | type MyF64 = f64 |
| 2 | |
| 3 | struct SelectorCastHolder { |
| 4 | x ?f64 |
| 5 | ax ?MyF64 |
| 6 | } |
| 7 | |
| 8 | struct GenericSelectorCastHolder[T] { |
| 9 | x ?T |
| 10 | } |
| 11 | |
| 12 | fn result_f64() !f64 { |
| 13 | return error('no f64') |
| 14 | } |
| 15 | |
| 16 | fn result_f32() !f32 { |
| 17 | return error('no f32') |
| 18 | } |
| 19 | |
| 20 | fn option_f64() ?f64 { |
| 21 | return none |
| 22 | } |
| 23 | |
| 24 | fn result_my_f64() !MyF64 { |
| 25 | return error('no MyF64') |
| 26 | } |
| 27 | |
| 28 | fn option_my_f64() ?MyF64 { |
| 29 | return none |
| 30 | } |
| 31 | |
| 32 | fn result_generic[T]() !T { |
| 33 | return error('no generic') |
| 34 | } |
| 35 | |
| 36 | fn cast_or_block_return() int { |
| 37 | return int(result_f64() or { return 7 }) |
| 38 | } |
| 39 | |
| 40 | fn keep_none() ?f64 { |
| 41 | return option_f64() or { none } |
| 42 | } |
| 43 | |
| 44 | fn keep_error() !f64 { |
| 45 | return result_f64() or { error('fallback') } |
| 46 | } |
| 47 | |
| 48 | fn selector_cast_return(h SelectorCastHolder) int { |
| 49 | return int(h.x or { return 7 }) |
| 50 | } |
| 51 | |
| 52 | fn selector_keep_none(h SelectorCastHolder) ?f64 { |
| 53 | return h.x or { none } |
| 54 | } |
| 55 | |
| 56 | fn selector_keep_error(h SelectorCastHolder) !f64 { |
| 57 | return h.x or { error('fallback') } |
| 58 | } |
| 59 | |
| 60 | fn test_or_block_result_cast() { |
| 61 | a := int(result_f64() or { 256.0 }) |
| 62 | b := int(result_f64() or { f64(256.0) }) |
| 63 | c := int(result_f32() or { f32(42.0) }) |
| 64 | d := int(option_f64() or { 128.0 }) |
| 65 | e := int(option_f64() or { f64(128.0) }) |
| 66 | |
| 67 | assert a == 256 |
| 68 | assert b == 256 |
| 69 | assert c == 42 |
| 70 | assert d == 128 |
| 71 | assert e == 128 |
| 72 | } |
| 73 | |
| 74 | fn test_or_block_result_cast_alias_payload() { |
| 75 | a := int(result_my_f64() or { MyF64(64.0) }) |
| 76 | b := int(option_my_f64() or { MyF64(32.0) }) |
| 77 | |
| 78 | assert a == 64 |
| 79 | assert b == 32 |
| 80 | } |
| 81 | |
| 82 | fn test_or_block_result_cast_generic_call() { |
| 83 | a := int(result_generic[f64]() or { f64(16.0) }) |
| 84 | |
| 85 | assert a == 16 |
| 86 | } |
| 87 | |
| 88 | fn test_or_block_cast_preserves_parent_exits() { |
| 89 | assert cast_or_block_return() == 7 |
| 90 | assert keep_none() == none |
| 91 | |
| 92 | if _ := keep_error() { |
| 93 | assert false |
| 94 | } else { |
| 95 | assert err.msg() == 'fallback' |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | fn test_or_block_selector_cast() { |
| 100 | h := SelectorCastHolder{} |
| 101 | gh := GenericSelectorCastHolder[f64]{} |
| 102 | |
| 103 | a := int(h.x or { 3.0 }) |
| 104 | b := int(h.x or { f64(4.0) }) |
| 105 | c := int(h.ax or { MyF64(5.0) }) |
| 106 | d := int(gh.x or { f64(6.0) }) |
| 107 | |
| 108 | assert a == 3 |
| 109 | assert b == 4 |
| 110 | assert c == 5 |
| 111 | assert d == 6 |
| 112 | } |
| 113 | |
| 114 | fn test_or_block_selector_cast_preserves_parent_exits() { |
| 115 | h := SelectorCastHolder{} |
| 116 | assert selector_cast_return(h) == 7 |
| 117 | assert selector_keep_none(h) == none |
| 118 | |
| 119 | if _ := selector_keep_error(h) { |
| 120 | assert false |
| 121 | } else { |
| 122 | assert err.msg() == 'fallback' |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | fn test_or_block_result_void_context() { |
| 127 | mut seen := false |
| 128 | result_f64() or { seen = true } |
| 129 | assert seen |
| 130 | |
| 131 | result_f64() or {} |
| 132 | } |
| 133 | |