/*
 * 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.netbeans.api.search;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import junit.textui.TestRunner;
import org.netbeans.api.search.SearchHistory;
import org.netbeans.api.search.SearchPattern;
import org.netbeans.junit.NbTestCase;
import org.netbeans.junit.NbTestSuite;


/**
 *
 * @author  Martin Roskanin
 */
public final class SearchHistoryTest extends NbTestCase {


    /**
     */
    public SearchHistoryTest(String name) {
        super(name);
    }

    /**
     */
    public static void main(String args[]) {
        TestRunner.run(new NbTestSuite(SearchHistoryTest.class));
    }


    /**
     */
    public void testSearchPatternSize() throws Exception {
        assertSize("SearchPattern size", 256, SearchPattern.create("searchText",true,true,false));
    }

    public void testSearchHistoryListSize() throws Exception{
        for (int i = 0; i<60; i++){
            SearchHistory.getDefault().add(SearchPattern.create(String.valueOf(i),true,true,false));
        }
        assertTrue(SearchHistory.getDefault().getSearchPatterns().size() == 10);
    }
    
    public void testLastSelectedListener() throws Exception{
        final boolean fired[] = new boolean[1];
        fired[0] = false;
        PropertyChangeListener pcl = new PropertyChangeListener(){
            @Override
                public void propertyChange(PropertyChangeEvent evt){
                    if (evt!=null && SearchHistory.LAST_SELECTED.equals(evt.getPropertyName())){
                        fired[0] = true;
                    }
                }
        };
        SearchHistory.getDefault().add(SearchPattern.create("init",true,true,false));
        SearchHistory.getDefault().addPropertyChangeListener(pcl);
        SearchHistory.getDefault().setLastSelected(SearchPattern.create("newSearchtext",true,true,false));
        SearchHistory.getDefault().removePropertyChangeListener(pcl);
        assertTrue(fired[0]);
    }    
    
    public void testAddToSearchHistoryListener() throws Exception{
        final boolean fired[] = new boolean[2];
        PropertyChangeListener pcl = new PropertyChangeListener(){
            @Override
                public void propertyChange(PropertyChangeEvent evt){
                    if (evt!=null && SearchHistory.ADD_TO_HISTORY.equals(evt.getPropertyName())){
                        fired[0] = true;
                    }else{
                        fired[1] = true;
                    }
                }
        };
        SearchHistory.getDefault().addPropertyChangeListener(pcl);
        SearchHistory.getDefault().add(SearchPattern.create("searchtext",true,true,false));
        SearchHistory.getDefault().removePropertyChangeListener(pcl);
        assertTrue(fired[0]);
        assertFalse("Only the expected change is fired", fired[1]);
    }
    
    public void testAddIncorrectItemToSearchHistoryListener() throws Exception{
        final boolean fired[] = new boolean[2];
        
        PropertyChangeListener pcl = new PropertyChangeListener(){
            @Override
                public void propertyChange(PropertyChangeEvent evt){
                    if (evt!=null && SearchHistory.ADD_TO_HISTORY.equals(evt.getPropertyName())){
                        fired[0] = true;
                    } else {
                        fired[1] = true;
                    }
                }
        };
        SearchHistory.getDefault().addPropertyChangeListener(pcl);

        // add valid pattern
        fired[0] = false;
        fired[1] = false;
        SearchHistory.getDefault().add(SearchPattern.create("searchtext2",true,true,false));
        assertTrue(fired[0]);
        assertFalse("Only the expected change is fired", fired[1]);
        
        // add the same pattern, it shouldn't be added
        fired[0] = false;
        fired[1] = false;        
        SearchHistory.getDefault().add(SearchPattern.create("searchtext2",true,true,false));
        assertTrue(!fired[0]);
        assertFalse("Only the expected change is fired", fired[1]);
        
        // add null pattern
        fired[0] = false;
        fired[1] = false;        
        SearchHistory.getDefault().add(null);
        assertTrue(!fired[0]);
        assertFalse("Only the expected change is fired", fired[1]);
        
        // add pattern with null searchExpression
        fired[0] = false;
        fired[1] = false;        
        SearchHistory.getDefault().add(SearchPattern.create(null,true,true,false));
        assertTrue(!fired[0]);
        assertFalse("Only the expected change is fired", fired[1]);
        
        // add pattern with empty searchExpression
        fired[0] = false;
        fired[1] = false;        
        SearchHistory.getDefault().add(SearchPattern.create("",true,true,false));
        assertTrue(!fired[0]);
        assertFalse("Only the expected change is fired", fired[1]);
        
        SearchHistory.getDefault().removePropertyChangeListener(pcl);
    }
    
    
    public void testEquals() throws Exception{
        SearchPattern pattern_one = SearchPattern.create("one",false, false, false);
        SearchPattern pattern_one_a = SearchPattern.create("one",true, false, false);        
        SearchPattern pattern_one_b = SearchPattern.create("one",false, true, false);
        SearchPattern pattern_one_c = SearchPattern.create("one",false,false, true);
        SearchPattern pattern_one_d = SearchPattern.create("one",true,true, false);
        SearchPattern pattern_one_e = SearchPattern.create("one",true,false, true);
        SearchPattern pattern_one_f = SearchPattern.create("one",true,true, true);
        
        SearchPattern pattern_two = SearchPattern.create("two",false, false, false);
        SearchPattern pattern_TwO = SearchPattern.create("TwO",false, false, false);
        SearchPattern pattern_TwO_a = SearchPattern.create("TwO",false, true, false);
        
        SearchPattern pattern_one_test = SearchPattern.create("one",false, false, false);
        SearchPattern pattern_one_a_test = SearchPattern.create("one",true, false, false);        
        SearchPattern pattern_one_b_test = SearchPattern.create("one",false, true, false);
        SearchPattern pattern_one_c_test = SearchPattern.create("one",false,false, true);
        SearchPattern pattern_one_d_test = SearchPattern.create("one",true,true, false);
        SearchPattern pattern_one_e_test = SearchPattern.create("one",true,false, true);
        SearchPattern pattern_one_f_test = SearchPattern.create("one",true,true, true);
        
        SearchPattern pattern_two_test = SearchPattern.create("two",false, false, false);
        SearchPattern pattern_TwO_test = SearchPattern.create("TwO",false, false, false);
        SearchPattern pattern_TwO_a_test = SearchPattern.create("TwO",false, true, false);
        
        assertTrue(pattern_one.equals(pattern_one_test));
        assertTrue(pattern_one_test.equals(pattern_one));
        assertTrue(pattern_one_a_test.equals(pattern_one_a));
        assertTrue(pattern_one_b_test.equals(pattern_one_b));
        assertTrue(pattern_one_c_test.equals(pattern_one_c));
        assertTrue(pattern_one_d_test.equals(pattern_one_d));
        assertTrue(pattern_one_e_test.equals(pattern_one_e));
        assertTrue(pattern_one_f_test.equals(pattern_one_f));
        //--------------------------------------------------
        assertTrue(!pattern_one_a_test.equals(pattern_one_b));
        assertTrue(!pattern_one_a_test.equals(pattern_one_c));
        assertTrue(!pattern_one_b_test.equals(pattern_one_c));
        assertTrue(!pattern_one_d_test.equals(pattern_one_e));
        
        assertTrue(pattern_two.equals(pattern_two_test));
        assertTrue(pattern_TwO.equals(pattern_TwO_test));
        assertTrue(pattern_TwO_a.equals(pattern_TwO_a_test));
        assertTrue(!pattern_two.equals(pattern_TwO_test));
        assertTrue(!pattern_TwO_a.equals(pattern_TwO_test));
    }
    
    public void testHashCode() throws Exception{
        int pattern_one = SearchPattern.create("one",false, false, false).hashCode();
        int pattern_one_a = SearchPattern.create("one",true, false, false).hashCode();        
        int pattern_one_b = SearchPattern.create("one",false, true, false).hashCode();
        int pattern_one_c = SearchPattern.create("one",false,false, true).hashCode();
        int pattern_one_d = SearchPattern.create("one",true,true, false).hashCode();
        int pattern_one_e = SearchPattern.create("one",true,false, true).hashCode();
        int pattern_one_f = SearchPattern.create("one",true,true, true).hashCode();
        
        int pattern_two = SearchPattern.create("two",false, false, false).hashCode();
        int pattern_TwO = SearchPattern.create("TwO",false, false, false).hashCode();
        int pattern_TwO_a = SearchPattern.create("TwO",false, true, false).hashCode();
        
        int pattern_one_test = SearchPattern.create("one",false, false, false).hashCode();
        int pattern_one_a_test = SearchPattern.create("one",true, false, false).hashCode();        
        int pattern_one_b_test = SearchPattern.create("one",false, true, false).hashCode();
        int pattern_one_c_test = SearchPattern.create("one",false,false, true).hashCode();
        int pattern_one_d_test = SearchPattern.create("one",true,true, false).hashCode();
        int pattern_one_e_test = SearchPattern.create("one",true,false, true).hashCode();
        int pattern_one_f_test = SearchPattern.create("one",true,true, true).hashCode();
        
        int pattern_two_test = SearchPattern.create("two",false, false, false).hashCode();
        int pattern_TwO_test = SearchPattern.create("TwO",false, false, false).hashCode();
        int pattern_TwO_a_test = SearchPattern.create("TwO",false, true, false).hashCode();
        
        assertTrue(pattern_one == pattern_one_test);
        assertTrue(pattern_one_test == pattern_one);
        assertTrue(pattern_one_a_test == pattern_one_a);
        assertTrue(pattern_one_b_test == pattern_one_b);
        assertTrue(pattern_one_c_test == pattern_one_c);
        assertTrue(pattern_one_d_test == pattern_one_d);
        assertTrue(pattern_one_e_test == pattern_one_e);
        assertTrue(pattern_one_f_test == pattern_one_f);
        //--------------------------------------------------
        assertTrue(pattern_one_a_test != pattern_one_b);
        assertTrue(pattern_one_a_test != pattern_one_c);
        assertTrue(pattern_one_b_test != pattern_one_c);
        assertTrue(pattern_one_d_test != pattern_one_e);
        
        assertTrue(pattern_two == pattern_two_test);
        assertTrue(pattern_TwO == pattern_TwO_test);
        assertTrue(pattern_TwO_a == pattern_TwO_a_test);
        assertTrue(pattern_two != pattern_TwO_test);
        assertTrue(pattern_TwO_a != pattern_TwO_test);
    }
    
}
