github.com/andy2046/gopie@v0.7.0/pkg/lru/lru_test.go (about)

     1  package lru
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  )
     7  
     8  type simpleStruct struct {
     9  	int
    10  	string
    11  }
    12  
    13  type complexStruct struct {
    14  	int
    15  	simpleStruct
    16  }
    17  
    18  var getTests = []struct {
    19  	name       string
    20  	keyToAdd   interface{}
    21  	keyToGet   interface{}
    22  	expectedOk bool
    23  }{
    24  	{"string_hit", "myKey", "myKey", true},
    25  	{"string_miss", "myKey", "nonsense", false},
    26  	{"simple_struct_hit", simpleStruct{1, "two"}, simpleStruct{1, "two"}, true},
    27  	{"simeple_struct_miss", simpleStruct{1, "two"}, simpleStruct{0, "noway"}, false},
    28  	{"complex_struct_hit", complexStruct{1, simpleStruct{2, "three"}},
    29  		complexStruct{1, simpleStruct{2, "three"}}, true},
    30  }
    31  
    32  func TestGet(t *testing.T) {
    33  	for _, tt := range getTests {
    34  		lru := New(0)
    35  		lru.Add(tt.keyToAdd, 1234)
    36  		val, ok := lru.Get(tt.keyToGet)
    37  		if ok != tt.expectedOk {
    38  			t.Fatalf("%s: cache hit = %v; want %v", tt.name, ok, !ok)
    39  		} else if ok && val != 1234 {
    40  			t.Fatalf("%s expected get to return 1234 but got %v", tt.name, val)
    41  		}
    42  	}
    43  }
    44  
    45  func TestRemove(t *testing.T) {
    46  	lru := New(0)
    47  	lru.Add("myKey", 1234)
    48  	if val, ok := lru.Get("myKey"); !ok {
    49  		t.Fatal("TestRemove returned no match")
    50  	} else if val != 1234 {
    51  		t.Fatalf("TestRemove failed.  Expected %d, got %v", 1234, val)
    52  	}
    53  
    54  	lru.Remove("myKey")
    55  	if _, ok := lru.Get("myKey"); ok {
    56  		t.Fatal("TestRemove returned a removed entry")
    57  	}
    58  }
    59  
    60  func TestPurge(t *testing.T) {
    61  	purgedKeys := make([]interface{}, 0)
    62  	onPurgedFun := func(key interface{}, value interface{}) {
    63  		purgedKeys = append(purgedKeys, key)
    64  	}
    65  
    66  	lru := New(20)
    67  	lru.OnPurged = onPurgedFun
    68  	for i := 0; i < 22; i++ {
    69  		lru.Add(fmt.Sprintf("myKey%d", i), 1234)
    70  	}
    71  
    72  	if len(purgedKeys) != 2 {
    73  		t.Fatalf("got %d evicted keys; want 2", len(purgedKeys))
    74  	}
    75  	if purgedKeys[0] != interface{}("myKey0") {
    76  		t.Fatalf("got %v in first evicted key; want %s", purgedKeys[0], "myKey0")
    77  	}
    78  	if purgedKeys[1] != interface{}("myKey1") {
    79  		t.Fatalf("got %v in second evicted key; want %s", purgedKeys[1], "myKey1")
    80  	}
    81  }
    82  
    83  func BenchmarkLRU(b *testing.B) {
    84  	purgedKeys := make([]interface{}, 0)
    85  	onPurgedFun := func(key interface{}, value interface{}) {
    86  		purgedKeys = append(purgedKeys, key)
    87  	}
    88  	n, m := 20, 40
    89  	lru := New(n)
    90  	lru.OnPurged = onPurgedFun
    91  	b.ResetTimer()
    92  	for i := 0; i < b.N; i++ {
    93  		lru.Add(fmt.Sprintf("myKey%d", i%m), 1234)
    94  	}
    95  }