@@ -87,15 +87,32 @@ describe('intersection', () => {
87
87
assertStrictEqual ( T . decode ( value ) , value )
88
88
} )
89
89
90
- it ( 'should play well with stripping combinators' , ( ) => {
91
- const A = t . exact ( t . type ( { a : t . string } ) )
92
- const B = t . exact ( t . type ( { b : t . number } ) )
93
- const T = t . intersection ( [ A , B ] )
94
- assertSuccess ( T . decode ( { a : 'a' , b : 1 } ) )
95
- assertSuccess ( T . decode ( { a : 'a' , b : 1 , c : true } ) , { a : 'a' , b : 1 } )
96
- assertFailure ( T , { a : 'a' } , [
90
+ it ( 'should play well with exact' , ( ) => {
91
+ const T1 = t . intersection ( [ t . exact ( t . type ( { a : t . string } ) ) , t . exact ( t . type ( { b : t . number } ) ) ] )
92
+ assertSuccess ( T1 . decode ( { a : 'a' , b : 1 } ) , { a : 'a' , b : 1 } )
93
+ assertSuccess ( T1 . decode ( { a : 'a' , b : 1 , c : true } ) , { a : 'a' , b : 1 } )
94
+ assertFailure ( T1 , { a : 'a' } , [
97
95
'Invalid value undefined supplied to : ({| a: string |} & {| b: number |})/1: {| b: number |}/b: number'
98
96
] )
97
+
98
+ const T2 = t . intersection ( [ t . exact ( t . type ( { } ) ) , t . partial ( { a : t . number } ) ] )
99
+ assertSuccess ( T2 . decode ( { } ) , { } )
100
+ assertSuccess ( T2 . decode ( { a : 1 } ) , { a : 1 } )
101
+ assertSuccess ( T2 . decode ( { a : undefined } ) , { a : undefined } )
102
+ assertSuccess ( T2 . decode ( { a : 1 , b : true } ) , { a : 1 , b : true } as any )
103
+
104
+ // #397
105
+ const T3 = t . intersection ( [ t . exact ( t . type ( { } ) ) , t . exact ( t . partial ( { a : t . number } ) ) ] )
106
+ assertSuccess ( T3 . decode ( { } ) , { } )
107
+ assertSuccess ( T3 . decode ( { a : 1 } ) , { a : 1 } )
108
+ assertSuccess ( T3 . decode ( { a : undefined } ) , { a : undefined } )
109
+ assertSuccess ( T3 . decode ( { a : 1 , b : true } ) , { a : 1 } )
110
+
111
+ const T4 = t . intersection ( [ t . type ( { b : t . string } ) , t . exact ( t . partial ( { a : t . number } ) ) ] )
112
+ assertSuccess ( T4 . decode ( { b : 'b' } ) , { b : 'b' } )
113
+ assertSuccess ( T4 . decode ( { b : 'b' , a : 1 } ) , { b : 'b' , a : 1 } )
114
+ assertSuccess ( T4 . decode ( { b : 'b' , a : undefined } ) , { b : 'b' , a : undefined } )
115
+ assertSuccess ( T4 . decode ( { b : 'b' , a : 1 , c : 2 } ) , { b : 'b' , a : 1 , c : 2 } as any )
99
116
} )
100
117
} )
101
118
@@ -149,8 +166,23 @@ describe('intersection', () => {
149
166
const T = t . intersection ( [ t . string ] as any )
150
167
assert . strictEqual ( T . is ( 'a' ) , true )
151
168
assert . strictEqual ( T . is ( 1 ) , false )
152
- assertSuccess ( T . decode ( 'a' ) )
169
+ assertSuccess ( T . decode ( 'a' ) , 'a' )
153
170
assertFailure ( T , 1 , [ 'Invalid value 1 supplied to : (string)/0: string' ] )
154
171
assert . strictEqual ( T . encode ( 'a' ) , 'a' )
155
172
} )
173
+
174
+ it ( 'should handle primitives' , ( ) => {
175
+ const T1 = t . intersection ( [ t . string , t . string ] )
176
+ assert . strictEqual ( T1 . is ( 'a' ) , true )
177
+ assert . strictEqual ( T1 . is ( 1 ) , false )
178
+ assertSuccess ( T1 . decode ( 'a' ) , 'a' )
179
+ assertFailure ( T1 , 1 , [
180
+ 'Invalid value 1 supplied to : (string & string)/0: string' ,
181
+ 'Invalid value 1 supplied to : (string & string)/1: string'
182
+ ] )
183
+ assert . strictEqual ( T1 . encode ( 'a' ) , 'a' )
184
+ const T2 = t . intersection ( [ NumberFromString , NumberFromString ] )
185
+ assertSuccess ( T2 . decode ( '1' ) , 1 )
186
+ assert . strictEqual ( T2 . encode ( 1 ) , '1' )
187
+ } )
156
188
} )
0 commit comments