/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.harvard.iq.dataverse.mydata;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author rmp553
 */
public class SolrQueryFormatterTest {
    
    public SolrQueryFormatterTest() {
    }
    
    @BeforeClass
    public static void setUpClass() {
    }
    
    @AfterClass
    public static void tearDownClass() {
    }
    
    @Before
    public void setUp() {
    }
    
    @After
    public void tearDown() {
    }

    private Long[] getRandomListOfLongs(int listCount, int topNumber){
       
        Random r = new Random();
        
        Long[] array = new Long[listCount];
        long last = 0;
        for (int idx = 0; idx < listCount; idx++) {
            last = r.nextInt(topNumber);// + 1;
            array[idx] = last;
        }
        return array;
    }
    
    private Long[] getListOfLongs(int listCount){
        Long[] array = new Long[listCount];
        for (long a = 0; a < array.length; a++) {
            array[(int)a] = a+1;
        }
        return array;
    }
    
    /**
     * Test of buildIdQuery method, of class SolrQueryFormatter.
     */
    @Test
    public void testBasics() {
        msgt("Set group size to 10--it's usually, 1,000");
        SolrQueryFormatter sqf = new SolrQueryFormatter();
        sqf.setSolrIdGroupSize(10);

        String paramName = "entityId";
        // -----------------------------------------
        msgt("List of 10 ids from 1, 10");        
        // -----------------------------------------
        //makeQueryTest(sqf, 10, paramName, "(entityId:(1 2 3 4 5 6 7 8 9 10))");
        makeQueryTest2(sqf, 10, paramName, 1);

        // -----------------------------------------
        msgt("List of 11 ids from 1, 11");        
        // -----------------------------------------
        //makeQueryTest(sqf, 11, paramName, "(entityId:(1 2 3 4 5 6 7 8 9 10)) OR (entityId:(11))");
        makeQueryTest2(sqf, 11, paramName, 2);

        // -----------------------------------------
        msgt("List of 21 ids from 1, 21");        
        // -----------------------------------------
        //makeQueryTest(sqf, 21, paramName, "(entityId:(1 2 3 4 5 6 7 8 9 10)) OR (entityId:(11 12 13 14 15 17 16 19 18 21)) OR (entityId:(20))");
        makeQueryTest2(sqf, 21, paramName, 3);

        // -----------------------------------------
        msgt("List of ids is empty");        
        // -----------------------------------------
        makeQueryTest(sqf, 0, paramName, null);
        //makeQueryTest2(sqf, 0, paramName, null);

        // -----------------------------------------
        msgt("List of ids from 1 to 11");        
        // -----------------------------------------
        msgt("Set to groups of 3");
        sqf.setSolrIdGroupSize(3);
        String expectedResult = "(parentId:(1 2 3)) OR (parentId:(4 5 6)) OR (parentId:(7 8 9)) OR (parentId:(10 11))";//([parentId:(1 2 3)) OR (parentId:(4 5 6)) OR (parentId:(7 8 9)) OR (parentId:(10 11 12)) OR (parentId:(13 14 15)) OR (parentId:(17 16 19)) OR (parentId:(18 21 20)) OR (parentId:(23 22 25)) OR (parentId:(24 27 26)) OR (parentId:(29 28 31)) OR (parentId:(30 34 35)) OR (parentId:(32 33 38)) OR (parentId:(39 36 37)) OR (parentId:(42 43 40)) OR (parentId:(41 46 47)) OR (parentId:(44 45 51)) OR (parentId:(50 49 48)) OR (parentId:(55 54 53)) OR (parentId:(52 59 58)) OR (parentId:(57 56 63)) OR (parentId:(62 61 60)) OR (parentId:(68 69 70)) OR (parentId:(71 64 65)) OR (parentId:(66 67]))> but was:<([entityId:(1 2 3 4 5 6 7 8 9 10)) OR (entityId:(11 12 13 14 15 17 16 19 18 21)) OR (entityId:(20]))";
        //makeQueryTest(sqf, 11, "parentId", expectedResult);
        makeQueryTest2(sqf, 11, "parentId", 4);
        
    }
 
    private void makeQueryTest2(SolrQueryFormatter sqf, int numIds, String paramName, int numParamOccurrences){
        
        Long[] idList = this.getListOfLongs(numIds);
        Set<Long> idListSet = new HashSet<>(Arrays.asList(idList));                 
                
        String queryClause = sqf.buildIdQuery(idListSet, paramName);
        msgt("query clause: " + queryClause);
        assertEquals(StringUtils.countMatches(queryClause, paramName), numParamOccurrences);
    }
       
    private void makeQueryTest(SolrQueryFormatter sqf, int numIds, String paramName, String expectedQuery){
        
        Long[] idList = this.getListOfLongs(numIds);
        Set<Long> idListSet = new HashSet<>(Arrays.asList(idList));                 
                
        String queryClause = sqf.buildIdQuery(idListSet, paramName);
        msgt("query clause: " + queryClause);
        assertEquals(queryClause, expectedQuery);
    }
    
    private void msg(String s){
        System.out.println(s);
    }
    
    private void msgt(String s){
        msg("-------------------------------");
        msg(s);
        msg("-------------------------------");
    }
}

@@ -4506,32 +4506,38 @@
 stSet, paramName
+, null
 );%0A        msgt(
@@ -5014,16 +5014,22 @@
 aramName
+, null
 );%0A     

Fix test for new signature