# This file reports differences detected by import.go since the last import.
# This is only for human review and not machine consumption.
# Please see go/thirdpartygo for more information.
# DO NOT EDIT. This must only be generated by //third_party/golang/import.go.

@@ import (
 	"math/rand"
 	"testing"
 	"time"
+
+	"google3/third_party/golang/cmp/cmp"
 )
 
 func init() {
@@ func TestARC_Peek(t *testing.T) {
 		t.Errorf("should not have updated recent-ness of 1")
 	}
 }
+
+func TestARC_OnEvictedCallback(t *testing.T) {
+	type testCase struct {
+		size    int
+		data    []int
+		evicted []int
+	}
+
+	testCases := map[string]testCase{
+		"basic-lru-like": {
+			size:    2,
+			data:    []int{1, 2, 3, 4},
+			evicted: []int{1, 2},
+		},
+		"t1-to-t2-promotion-simple": {
+			size:    4,
+			data:    []int{1, 2, 1, 2, 3, 4, 5, 6},
+			evicted: []int{3, 4},
+		},
+		"adaptive-replacement-simple": {
+			size:    4,
+			data:    []int{1, 2, 3, 4, 5, 6, 1, 2, 7, 8},
+			evicted: []int{1, 2, 3, 4, 1, 5},
+		},
+		"MFU-not-evicted-by-new-entries": {
+			size:    4,
+			data:    []int{4, 4, 1, 2, 3, 4, 5, 6, 7, 8},
+			evicted: []int{1, 2, 3, 5},
+		},
+		"t2-full-b2-empty-new-items": {
+			size: 4,
+			data: []int{
+				// fill t2, b2 should be empty since its target size is zero
+				1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+				// insert "new" items
+				1, 2, 3, 4,
+			},
+			evicted: []int{1, 2, 3, 4, 5, 1, 2, 3},
+		},
+	}
+
+	runTest := func(t *testing.T, tc testCase) {
+		evicted := []int{}
+		c, err := NewARCWithEvict(tc.size, func(key interface{}, _ interface{}) {
+			evicted = append(evicted, key.(int))
+		})
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		for _, val := range tc.data {
+			c.Add(val, val)
+		}
+
+		if !cmp.Equal(tc.evicted, evicted) {
+			t.Errorf("Expectations mismatch.\nWant: %+v\nGot:  %+v", tc.evicted, evicted)
+		}
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) { runTest(t, tc) })
+	}
+}
