RingBufferTests.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright 2021 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. import XCTest
  15. @testable import FirebaseCoreInternal
  16. class RingBufferTests: XCTestCase {
  17. // `RingBuffer` is a generic type. `String` is used for simplified testing.
  18. typealias Element = String
  19. func testPush_WhenCapacityIsZero_DoesNothing() throws {
  20. // Given
  21. var ringBuffer = RingBuffer<Element>(capacity: 0)
  22. // When
  23. ringBuffer.push("ezra")
  24. // Then
  25. XCTAssertEqual(Array(ringBuffer), [])
  26. }
  27. func testPush_WhenUnderFullCapacity_OverwritesAndReturnsTailElement() throws {
  28. // Given
  29. var ringBuffer = RingBuffer<Element>(capacity: 3) // [nil, nil, nil]
  30. // When
  31. let overwrittenElement = ringBuffer.push("vader") // ["vader", nil, nil]
  32. // Then
  33. XCTAssertNil(overwrittenElement)
  34. }
  35. func testPush_WhenAtFullCapacity_OverwritesAndReturnsTailElement() throws {
  36. // Given
  37. var ringBuffer = RingBuffer<Element>(capacity: 1) // [nil]
  38. ringBuffer.push("luke") // ["luke"] where "luke" is the tail element.
  39. // When
  40. let overwrittenElement = ringBuffer.push("vader")
  41. // Then
  42. XCTAssertEqual(overwrittenElement, "luke")
  43. XCTAssertEqual(Array(ringBuffer), ["vader"])
  44. }
  45. func testPush_WhenAtFullCapacity_FollowsFIFO_Ordering() throws {
  46. // Given
  47. var ringBuffer = RingBuffer<Element>(capacity: 3) // [nil, nil, nil]
  48. // When
  49. ringBuffer.push("chewy") // ["chewy", nil, nil]
  50. ringBuffer.push("vader") // ["chewy", "vader", nil]
  51. ringBuffer.push("jabba") // ["chewy", "vader", "jabba"]
  52. ringBuffer.push("lando") // ["lando", "vader", "jabba"]
  53. // Then
  54. XCTAssertEqual(Array(ringBuffer), ["lando", "vader", "jabba"])
  55. }
  56. func testPushFollowsFIFO_Ordering() throws {
  57. // Given
  58. var ringBuffer = RingBuffer<Element>(capacity: 10)
  59. // When
  60. ringBuffer.push("han solo")
  61. ringBuffer.push("boba")
  62. ringBuffer.push("jabba")
  63. // Then
  64. XCTAssertEqual(Array(ringBuffer), ["han solo", "boba", "jabba"])
  65. }
  66. func testPushStressTest() throws {
  67. // Given
  68. var ringBuffer = RingBuffer<Int>(capacity: 10)
  69. // When
  70. for index in 1 ... 1000 {
  71. ringBuffer.push(index)
  72. }
  73. // Then
  74. XCTAssertEqual(Array(ringBuffer), Array(991 ... 1000))
  75. }
  76. func testPop_WhenCapacityIsZero_DoesNothingAndReturnsNil() throws {
  77. // Given
  78. var ringBuffer = RingBuffer<String>(capacity: 0)
  79. // When
  80. let popped = ringBuffer.pop()
  81. // Then
  82. XCTAssertNil(popped)
  83. XCTAssertEqual(Array(ringBuffer), [])
  84. }
  85. func testPopRemovesAndReturnsLastElement() throws {
  86. // Given
  87. var ringBuffer = RingBuffer<Element>(capacity: 3)
  88. ringBuffer.push("one")
  89. ringBuffer.push("two")
  90. ringBuffer.push("three")
  91. // When
  92. XCTAssertEqual(ringBuffer.pop(), "three")
  93. XCTAssertEqual(ringBuffer.pop(), "two")
  94. XCTAssertEqual(ringBuffer.pop(), "one")
  95. // Then
  96. XCTAssertEqual(Array(ringBuffer), [])
  97. }
  98. func testPopUndosPush_IncludingIndexingEdgeCases() throws {
  99. // Given
  100. var ringBuffer = RingBuffer<Int>(capacity: 10)
  101. for number in Array(1 ... 15) {
  102. ringBuffer.push(number)
  103. }
  104. // ringBuffer: [11, 12, 13, 14, 15, 6, 7, 8, 9, 10]
  105. // tailIndex - 1: ______________/
  106. // Then
  107. for number in Array(6 ... 15).reversed() {
  108. let popped = ringBuffer.pop()
  109. XCTAssertEqual(popped, number)
  110. }
  111. XCTAssertNil(ringBuffer.pop())
  112. XCTAssertEqual(Array(ringBuffer), [])
  113. }
  114. }