| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.lucene.util; |
| |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class TestFrequencyTrackingRingBuffer extends LuceneTestCase { |
| |
| private static void assertBuffer(FrequencyTrackingRingBuffer buffer, int maxSize, int sentinel, List<Integer> items) { |
| final List<Integer> recentItems; |
| if (items.size() <= maxSize) { |
| recentItems = new ArrayList<>(); |
| for (int i = items.size(); i < maxSize; ++i) { |
| recentItems.add(sentinel); |
| } |
| recentItems.addAll(items); |
| } else { |
| recentItems = items.subList(items.size() - maxSize, items.size()); |
| } |
| final Map<Integer, Integer> expectedFrequencies = new HashMap<Integer, Integer>(); |
| for (Integer item : recentItems) { |
| final Integer freq = expectedFrequencies.get(item); |
| if (freq == null) { |
| expectedFrequencies.put(item, 1); |
| } else { |
| expectedFrequencies.put(item, freq + 1); |
| } |
| } |
| assertEquals(expectedFrequencies, buffer.asFrequencyMap()); |
| } |
| |
| public void test() { |
| final int iterations = atLeast(100); |
| for (int i = 0; i < iterations; ++i) { |
| final int maxSize = 2 + random().nextInt(100); |
| final int numitems = random().nextInt(5000); |
| final int maxitem = 1 + random().nextInt(100); |
| List<Integer> items = new ArrayList<>(); |
| final int sentinel = random().nextInt(200); |
| FrequencyTrackingRingBuffer buffer = new FrequencyTrackingRingBuffer(maxSize, sentinel); |
| for (int j = 0; j < numitems; ++j) { |
| final Integer item = random().nextInt(maxitem); |
| items.add(item); |
| buffer.add(item); |
| } |
| assertBuffer(buffer, maxSize, sentinel, items); |
| } |
| } |
| |
| public void testRamBytesUsed() { |
| final int maxSize = 2 + random().nextInt(10000); |
| final int sentinel = random().nextInt(); |
| FrequencyTrackingRingBuffer buffer = new FrequencyTrackingRingBuffer(maxSize, sentinel); |
| for (int i = 0; i < 10000; ++i) { |
| buffer.add(random().nextInt()); |
| } |
| assertEquals(RamUsageTester.sizeOf(buffer), buffer.ramBytesUsed()); |
| } |
| |
| } |