@@ -1114,6 +1114,138 @@ class SignalProducerLiftingSpec: QuickSpec {
11141114 }
11151115 }
11161116
1117+ describe ( " withLatest(from: signal) " ) {
1118+ var withLatestProducer : SignalProducer < ( Int , String ) , NoError > !
1119+ var observer : Signal < Int , NoError > . Observer !
1120+ var sampleeObserver : Signal < String , NoError > . Observer !
1121+
1122+ beforeEach {
1123+ let ( producer, incomingObserver) = SignalProducer < Int , NoError > . pipe ( )
1124+ let ( samplee, incomingSampleeObserver) = Signal < String , NoError > . pipe ( )
1125+ withLatestProducer = producer. withLatest ( from: samplee)
1126+ observer = incomingObserver
1127+ sampleeObserver = incomingSampleeObserver
1128+ }
1129+
1130+ it ( " should forward the latest value when the receiver fires " ) {
1131+ var result : [ String ] = [ ]
1132+ withLatestProducer. startWithValues { ( left, right) in result. append ( " \( left) \( right) " ) }
1133+
1134+ sampleeObserver. send ( value: " a " )
1135+ sampleeObserver. send ( value: " b " )
1136+ observer. send ( value: 1 )
1137+ expect ( result) == [ " 1b " ]
1138+ }
1139+
1140+ it ( " should do nothing if receiver fires before samplee sends value " ) {
1141+ var result : [ String ] = [ ]
1142+ withLatestProducer. startWithValues { ( left, right) in result. append ( " \( left) \( right) " ) }
1143+
1144+ observer. send ( value: 1 )
1145+ expect ( result) . to ( beEmpty ( ) )
1146+ }
1147+
1148+ it ( " should send latest value with samplee value multiple times when receiver fires multiple times " ) {
1149+ var result : [ String ] = [ ]
1150+ withLatestProducer. startWithValues { ( left, right) in result. append ( " \( left) \( right) " ) }
1151+
1152+ sampleeObserver. send ( value: " a " )
1153+ observer. send ( value: 1 )
1154+ observer. send ( value: 2 )
1155+ expect ( result) == [ " 1a " , " 2a " ]
1156+ }
1157+
1158+ it ( " should complete when receiver has completed " ) {
1159+ var completed = false
1160+ withLatestProducer. startWithCompleted { completed = true }
1161+
1162+ observer. sendCompleted ( )
1163+ expect ( completed) == true
1164+ }
1165+
1166+ it ( " should not affect when samplee has completed " ) {
1167+ var event : Event < ( Int , String ) , NoError > ? = nil
1168+ withLatestProducer. start { event = $0 }
1169+
1170+ sampleeObserver. sendCompleted ( )
1171+ expect ( event) . to ( beNil ( ) )
1172+ }
1173+
1174+ it ( " should not affect when samplee has interrupted " ) {
1175+ var event : Event < ( Int , String ) , NoError > ? = nil
1176+ withLatestProducer. start { event = $0 }
1177+
1178+ sampleeObserver. sendInterrupted ( )
1179+ expect ( event) . to ( beNil ( ) )
1180+ }
1181+ }
1182+
1183+ describe ( " withLatest(from: producer) " ) {
1184+ var withLatestProducer : SignalProducer < ( Int , String ) , NoError > !
1185+ var observer : Signal < Int , NoError > . Observer !
1186+ var sampleeObserver : Signal < String , NoError > . Observer !
1187+
1188+ beforeEach {
1189+ let ( producer, incomingObserver) = SignalProducer < Int , NoError > . pipe ( )
1190+ let ( samplee, incomingSampleeObserver) = SignalProducer < String , NoError > . pipe ( )
1191+ withLatestProducer = producer. withLatest ( from: samplee)
1192+ observer = incomingObserver
1193+ sampleeObserver = incomingSampleeObserver
1194+ }
1195+
1196+ it ( " should forward the latest value when the receiver fires " ) {
1197+ var result : [ String ] = [ ]
1198+ withLatestProducer. startWithValues { ( left, right) in result. append ( " \( left) \( right) " ) }
1199+
1200+ sampleeObserver. send ( value: " a " )
1201+ sampleeObserver. send ( value: " b " )
1202+ observer. send ( value: 1 )
1203+ expect ( result) == [ " 1b " ]
1204+ }
1205+
1206+ it ( " should do nothing if receiver fires before samplee sends value " ) {
1207+ var result : [ String ] = [ ]
1208+ withLatestProducer. startWithValues { ( left, right) in result. append ( " \( left) \( right) " ) }
1209+
1210+ observer. send ( value: 1 )
1211+ expect ( result) . to ( beEmpty ( ) )
1212+ }
1213+
1214+ it ( " should send latest value with samplee value multiple times when receiver fires multiple times " ) {
1215+ var result : [ String ] = [ ]
1216+ withLatestProducer. startWithValues { ( left, right) in result. append ( " \( left) \( right) " ) }
1217+
1218+ sampleeObserver. send ( value: " a " )
1219+ observer. send ( value: 1 )
1220+ observer. send ( value: 2 )
1221+ expect ( result) == [ " 1a " , " 2a " ]
1222+ }
1223+
1224+ it ( " should complete when receiver has completed " ) {
1225+ var completed = false
1226+ withLatestProducer. startWithCompleted { completed = true }
1227+
1228+ observer. sendCompleted ( )
1229+ expect ( completed) == true
1230+ }
1231+
1232+ it ( " should not affect when samplee has completed " ) {
1233+ var event : Event < ( Int , String ) , NoError > ? = nil
1234+ withLatestProducer. start { event = $0 }
1235+
1236+ sampleeObserver. sendCompleted ( )
1237+ expect ( event) . to ( beNil ( ) )
1238+ }
1239+
1240+ it ( " should not affect when samplee has interrupted " ) {
1241+ var event : Event < ( Int , String ) , NoError > ? = nil
1242+ withLatestProducer. start { event = $0 }
1243+
1244+ sampleeObserver. sendInterrupted ( )
1245+ expect ( event) . to ( beNil ( ) )
1246+ }
1247+ }
1248+
11171249 describe ( " combineLatestWith " ) {
11181250 var combinedProducer : SignalProducer < ( Int , Double ) , NoError > !
11191251 var observer : Signal < Int , NoError > . Observer !
0 commit comments