You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

168 lines
3.0 KiB

  1. package simplelru
  2. import "testing"
  3. func TestLRU(t *testing.T) {
  4. evictCounter := 0
  5. onEvicted := func(k interface{}, v interface{}) {
  6. if k != v {
  7. t.Fatalf("Evict values not equal (%v!=%v)", k, v)
  8. }
  9. evictCounter++
  10. }
  11. l, err := NewLRU(128, onEvicted)
  12. if err != nil {
  13. t.Fatalf("err: %v", err)
  14. }
  15. for i := 0; i < 256; i++ {
  16. l.Add(i, i)
  17. }
  18. if l.Len() != 128 {
  19. t.Fatalf("bad len: %v", l.Len())
  20. }
  21. if evictCounter != 128 {
  22. t.Fatalf("bad evict count: %v", evictCounter)
  23. }
  24. for i, k := range l.Keys() {
  25. if v, ok := l.Get(k); !ok || v != k || v != i+128 {
  26. t.Fatalf("bad key: %v", k)
  27. }
  28. }
  29. for i := 0; i < 128; i++ {
  30. _, ok := l.Get(i)
  31. if ok {
  32. t.Fatalf("should be evicted")
  33. }
  34. }
  35. for i := 128; i < 256; i++ {
  36. _, ok := l.Get(i)
  37. if !ok {
  38. t.Fatalf("should not be evicted")
  39. }
  40. }
  41. for i := 128; i < 192; i++ {
  42. ok := l.Remove(i)
  43. if !ok {
  44. t.Fatalf("should be contained")
  45. }
  46. ok = l.Remove(i)
  47. if ok {
  48. t.Fatalf("should not be contained")
  49. }
  50. _, ok = l.Get(i)
  51. if ok {
  52. t.Fatalf("should be deleted")
  53. }
  54. }
  55. l.Get(192) // expect 192 to be last key in l.Keys()
  56. for i, k := range l.Keys() {
  57. if (i < 63 && k != i+193) || (i == 63 && k != 192) {
  58. t.Fatalf("out of order key: %v", k)
  59. }
  60. }
  61. l.Purge()
  62. if l.Len() != 0 {
  63. t.Fatalf("bad len: %v", l.Len())
  64. }
  65. if _, ok := l.Get(200); ok {
  66. t.Fatalf("should contain nothing")
  67. }
  68. }
  69. func TestLRU_GetOldest_RemoveOldest(t *testing.T) {
  70. l, err := NewLRU(128, nil)
  71. if err != nil {
  72. t.Fatalf("err: %v", err)
  73. }
  74. for i := 0; i < 256; i++ {
  75. l.Add(i, i)
  76. }
  77. k, _, ok := l.GetOldest()
  78. if !ok {
  79. t.Fatalf("missing")
  80. }
  81. if k.(int) != 128 {
  82. t.Fatalf("bad: %v", k)
  83. }
  84. k, _, ok = l.RemoveOldest()
  85. if !ok {
  86. t.Fatalf("missing")
  87. }
  88. if k.(int) != 128 {
  89. t.Fatalf("bad: %v", k)
  90. }
  91. k, _, ok = l.RemoveOldest()
  92. if !ok {
  93. t.Fatalf("missing")
  94. }
  95. if k.(int) != 129 {
  96. t.Fatalf("bad: %v", k)
  97. }
  98. }
  99. // Test that Add returns true/false if an eviction occurred
  100. func TestLRU_Add(t *testing.T) {
  101. evictCounter := 0
  102. onEvicted := func(k interface{}, v interface{}) {
  103. evictCounter++
  104. }
  105. l, err := NewLRU(1, onEvicted)
  106. if err != nil {
  107. t.Fatalf("err: %v", err)
  108. }
  109. if l.Add(1, 1) == true || evictCounter != 0 {
  110. t.Errorf("should not have an eviction")
  111. }
  112. if l.Add(2, 2) == false || evictCounter != 1 {
  113. t.Errorf("should have an eviction")
  114. }
  115. }
  116. // Test that Contains doesn't update recent-ness
  117. func TestLRU_Contains(t *testing.T) {
  118. l, err := NewLRU(2, nil)
  119. if err != nil {
  120. t.Fatalf("err: %v", err)
  121. }
  122. l.Add(1, 1)
  123. l.Add(2, 2)
  124. if !l.Contains(1) {
  125. t.Errorf("1 should be contained")
  126. }
  127. l.Add(3, 3)
  128. if l.Contains(1) {
  129. t.Errorf("Contains should not have updated recent-ness of 1")
  130. }
  131. }
  132. // Test that Peek doesn't update recent-ness
  133. func TestLRU_Peek(t *testing.T) {
  134. l, err := NewLRU(2, nil)
  135. if err != nil {
  136. t.Fatalf("err: %v", err)
  137. }
  138. l.Add(1, 1)
  139. l.Add(2, 2)
  140. if v, ok := l.Peek(1); !ok || v != 1 {
  141. t.Errorf("1 should be set to 1: %v, %v", v, ok)
  142. }
  143. l.Add(3, 3)
  144. if l.Contains(1) {
  145. t.Errorf("should not have updated recent-ness of 1")
  146. }
  147. }