DisposableSpec.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //
  2. // DisposableSpec.swift
  3. // ReactiveCocoa
  4. //
  5. // Created by Justin Spahr-Summers on 2014-07-13.
  6. // Copyright (c) 2014 GitHub. All rights reserved.
  7. //
  8. import Nimble
  9. import Quick
  10. import ReactiveCocoa
  11. class DisposableSpec: QuickSpec {
  12. override func spec() {
  13. describe("SimpleDisposable") {
  14. it("should set disposed to true") {
  15. let disposable = SimpleDisposable()
  16. expect(disposable.disposed) == false
  17. disposable.dispose()
  18. expect(disposable.disposed) == true
  19. }
  20. }
  21. describe("ActionDisposable") {
  22. it("should run the given action upon disposal") {
  23. var didDispose = false
  24. let disposable = ActionDisposable {
  25. didDispose = true
  26. }
  27. expect(didDispose) == false
  28. expect(disposable.disposed) == false
  29. disposable.dispose()
  30. expect(didDispose) == true
  31. expect(disposable.disposed) == true
  32. }
  33. }
  34. describe("CompositeDisposable") {
  35. var disposable = CompositeDisposable()
  36. beforeEach {
  37. disposable = CompositeDisposable()
  38. }
  39. it("should ignore the addition of nil") {
  40. disposable.addDisposable(nil)
  41. return
  42. }
  43. it("should dispose of added disposables") {
  44. let simpleDisposable = SimpleDisposable()
  45. disposable.addDisposable(simpleDisposable)
  46. var didDispose = false
  47. disposable.addDisposable {
  48. didDispose = true
  49. }
  50. expect(simpleDisposable.disposed) == false
  51. expect(didDispose) == false
  52. expect(disposable.disposed) == false
  53. disposable.dispose()
  54. expect(simpleDisposable.disposed) == true
  55. expect(didDispose) == true
  56. expect(disposable.disposed) == true
  57. }
  58. it("should not dispose of removed disposables") {
  59. let simpleDisposable = SimpleDisposable()
  60. let handle = disposable += simpleDisposable
  61. // We should be allowed to call this any number of times.
  62. handle.remove()
  63. handle.remove()
  64. expect(simpleDisposable.disposed) == false
  65. disposable.dispose()
  66. expect(simpleDisposable.disposed) == false
  67. }
  68. }
  69. describe("ScopedDisposable") {
  70. it("should dispose of the inner disposable upon deinitialization") {
  71. let simpleDisposable = SimpleDisposable()
  72. func runScoped() {
  73. let scopedDisposable = ScopedDisposable(simpleDisposable)
  74. expect(simpleDisposable.disposed) == false
  75. expect(scopedDisposable.disposed) == false
  76. }
  77. expect(simpleDisposable.disposed) == false
  78. runScoped()
  79. expect(simpleDisposable.disposed) == true
  80. }
  81. }
  82. describe("SerialDisposable") {
  83. var disposable: SerialDisposable!
  84. beforeEach {
  85. disposable = SerialDisposable()
  86. }
  87. it("should dispose of the inner disposable") {
  88. let simpleDisposable = SimpleDisposable()
  89. disposable.innerDisposable = simpleDisposable
  90. expect(disposable.innerDisposable).notTo(beNil())
  91. expect(simpleDisposable.disposed) == false
  92. expect(disposable.disposed) == false
  93. disposable.dispose()
  94. expect(disposable.innerDisposable).to(beNil())
  95. expect(simpleDisposable.disposed) == true
  96. expect(disposable.disposed) == true
  97. }
  98. it("should dispose of the previous disposable when swapping innerDisposable") {
  99. let oldDisposable = SimpleDisposable()
  100. let newDisposable = SimpleDisposable()
  101. disposable.innerDisposable = oldDisposable
  102. expect(oldDisposable.disposed) == false
  103. expect(newDisposable.disposed) == false
  104. disposable.innerDisposable = newDisposable
  105. expect(oldDisposable.disposed) == true
  106. expect(newDisposable.disposed) == false
  107. expect(disposable.disposed) == false
  108. disposable.innerDisposable = nil
  109. expect(newDisposable.disposed) == true
  110. expect(disposable.disposed) == false
  111. }
  112. }
  113. }
  114. }