content: /**
   * 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
   * <p>
   * http://www.apache.org/licenses/LICENSE-2.0
   * <p>
   * 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.atlas.repository.graphdb.janus;
  
  import org.testng.annotations.Test;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import static org.testng.Assert.assertEquals;
  
  public class AtlasJanusGraphIndexClientTest {
      @Test
      public void testGetTopTermsAsendingInput() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(10, 12, 15);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          assertOrder(top5Terms, 2, 1, 0);
      }
  
      @Test
      public void testGetTopTermsAsendingInput2() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(10, 12, 15, 20, 25, 26, 30, 40);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          assertOrder(top5Terms, 7, 6, 5, 4, 3);
      }
  
      @Test
      public void testGetTopTermsDescendingInput() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(10, 9, 8);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          assertOrder(top5Terms, 0, 1, 2);
      }
  
      @Test
      public void testGetTopTermsDescendingInput2() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(10, 9, 8, 7, 6, 5, 4, 3, 2);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          assertOrder(top5Terms, 0, 1, 2, 3, 4);
      }
  
      @Test
      public void testGetTopTermsRandom() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(10, 19, 28, 27, 16, 1, 30, 3, 36);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          //10, 19, 28, 27, 16, 1, 30, 3, 36
          //0,  1,  2,   3,  4, 5, 6,  7,  8
          assertOrder(top5Terms, 8, 6, 2, 3, 1);
      }
  
      @Test
      public void testGetTopTermsRandom2() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(36, 19, 28, 27, 16, 1, 30, 3, 10);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          //36, 19, 28, 27, 16, 1, 30, 3, 10
          //0,  1,  2,   3,  4, 5, 6,  7,  8
          assertOrder(top5Terms, 0, 6, 2, 3, 1);
      }
  
      @Test
      public void testGetTopTermsRandom3() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(36, 36, 28, 27, 16, 1, 30, 3, 10);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          //36, 36, 28, 27, 16, 1, 30, 3, 10
          //0,  1,  2,   3,  4, 5, 6,  7,  8
          assertOrder(top5Terms, 0, 1, 6, 2, 3);
      }
  
      @Test
      public void testGetTopTermsRandom4() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(10, 10, 28, 27, 16, 1, 30, 36, 36);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          //10, 10, 28, 27, 16, 1, 30, 36, 36
          //0,  1,  2,   3,  4, 5, 6,  7,  8
          assertOrder(top5Terms, 7, 8, 6, 2, 3);
      }
  
      @Test
      public void testGetTopTermsRandom5() {
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms     = generateTerms(36, 10, 28, 27, 16, 1, 30, 36, 36);
          List<String>                                     top5Terms = AtlasJanusGraphIndexClient.getTopTerms(terms);
  
          //36, 10, 28, 27, 16, 1, 30, 36, 36
          //0,  1,  2,   3,  4, 5, 6,  7,  8
          assertOrder(top5Terms, 0, 7, 8, 6, 2);
      }
  
      @Test
      public void testGenerateSuggestionString() {
          List<String> fields = new ArrayList<>();
  
          fields.add("one");
          fields.add("two");
          fields.add("three");
  
          String generatedString = AtlasJanusGraphIndexClient.generateSuggestionsString(fields);
  
          assertEquals(generatedString, "'one', 'two', 'three'");
      }
  
      @Test
      public void testGenerateSearchWeightString() {
          Map<String, Integer> fields = new HashMap<>();
  
          fields.put("one", 10);
          fields.put("two", 1);
          fields.put("three", 15);
  
          String generatedString = AtlasJanusGraphIndexClient.generateSearchWeightString(fields);
  
          assertEquals(generatedString, " one^10 two^1 three^15");
      }
  
      private void assertOrder(List<String> topTerms, int... indices) {
          assertEquals(topTerms.size(), indices.length);
  
          int i = 0;
          for (String term : topTerms) {
              assertEquals(Integer.toString(indices[i++]), term);
          }
  
          assertEquals(topTerms.size(), indices.length);
      }
  
      private Map<String, AtlasJanusGraphIndexClient.TermFreq> generateTerms(int... termFreqs) {
          int                                              i     = 0;
          Map<String, AtlasJanusGraphIndexClient.TermFreq> terms = new HashMap<>();
  
          for (int count : termFreqs) {
              AtlasJanusGraphIndexClient.TermFreq termFreq1 = new AtlasJanusGraphIndexClient.TermFreq(Integer.toString(i++), count);
  
              terms.put(termFreq1.getTerm(), termFreq1);
          }
  
          return terms;
      }
  }
  