Advertisement
Guest User

Untitled

a guest
Dec 29th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. package org.od.maprecord;
  2.  
  3. import org.junit.Before;
  4. import org.junit.Test;
  5. import rx.Observable;
  6. import rx.subjects.BehaviorSubject;
  7. import rx.subjects.Subject;
  8.  
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.List;
  12.  
  13. import static org.junit.Assert.assertEquals;
  14.  
  15. /**
  16. * Show how a spread can be calculated from an observable stream of bid prices and an observable stream of offer prices
  17. */
  18. public class TestSpreadCalc {
  19.  
  20. private Subject<Double, Double> bidStream;
  21. private Subject<Double, Double> offerStream;
  22. private List<Double> resultantSpreads = new ArrayList<>();
  23.  
  24. @Before
  25. public void doSetUp() {
  26. bidStream = BehaviorSubject.create();
  27. offerStream = BehaviorSubject.create();
  28. resultantSpreads.clear();
  29. }
  30.  
  31. @Test
  32. public void testCombineBidAndOfferStreamsToSpreadStream() {
  33.  
  34. Observable<Double> spreadStream = Observable.combineLatest(bidStream, offerStream, (bid, offer) -> {
  35. return offer - bid;
  36. });
  37.  
  38. //capture the output spreads
  39. spreadStream.subscribe(resultantSpreads::add);
  40.  
  41. newBid(99);
  42. //this will be ignored since there is not yet an offer
  43.  
  44. newBidAndOffer(99, 100);
  45. //spread is 1
  46.  
  47. newOffer(101);
  48. //spread is 2
  49.  
  50. newBid(98d);
  51. //spread is 3
  52.  
  53. //here we get 3 spreads in the output, which is what we want because we receive the second bid and second offer independently
  54. assertEquals(Arrays.asList(1d, 2d, 3d), resultantSpreads);
  55. }
  56.  
  57. @Test
  58. public void testCombineDoesNotPreserveAtomicityWhenFieldDeltasReceivedTogether() {
  59.  
  60. Observable<Double> spreadStream = Observable.combineLatest(bidStream, offerStream, (bid, offer) -> {
  61. return offer - bid;
  62. });
  63.  
  64. //capture the output spreads
  65. spreadStream.subscribe(resultantSpreads::add);
  66.  
  67. newBidAndOffer(99, 100);
  68. //spread is 1
  69.  
  70. newBidAndOffer(98, 101);
  71. //spread is 3
  72.  
  73. //here we still get 1,2,3 in the output, which is not really what we want - we have lost the atomicity of the newBidAndOffer
  74. //we really want 1, 3 without the transitional 2
  75. //this example serves to demonstrate the problem of preserving atomicity when we splitting an update into separate streams for bid and offer
  76. assertEquals(Arrays.asList(1d, 2d, 3d), resultantSpreads);
  77. }
  78.  
  79.  
  80. private void newBidAndOffer(double newBid, double newOffer) {
  81. bidStream.onNext(newBid);
  82. offerStream.onNext(newOffer);
  83. }
  84.  
  85. private void newBid(double newBid) {
  86. bidStream.onNext(newBid);
  87. }
  88.  
  89. private void newOffer(double newOffer) {
  90. offerStream.onNext(newOffer);
  91. }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement