/*=============================================================================#
 # Copyright (c) 2019, 2020 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.jcommons.text.core;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

import static org.eclipse.statet.jcommons.text.core.SearchPattern.PREFIX_MATCH;
import static org.eclipse.statet.jcommons.text.core.SearchPattern.SUBSTRING_MATCH;

import org.junit.jupiter.api.Test;

import org.eclipse.statet.jcommons.lang.NonNullByDefault;


@NonNullByDefault
public class SearchPatternTest {
	
	
	public SearchPatternTest() {
	}
	
	
	protected SearchPattern createPattern(final int rules) {
		return new SearchPattern(rules, "");
	}
	
	
	@Test
	public void matches_Prefix() {
		final SearchPattern pattern= createPattern(PREFIX_MATCH);
		
		pattern.setPattern("");
		assertEquals(PREFIX_MATCH, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		
		pattern.setPattern("a");
		assertEquals(PREFIX_MATCH, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(0, pattern.matches("xabcxabc"));
		assertEquals(0, pattern.matches("xbc"));
		
		pattern.setPattern("ab");
		assertEquals(0, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(0, pattern.matches("xabcxabc"));
		assertEquals(0, pattern.matches("xbc"));
		
		pattern.setPattern("bc");
		assertEquals(0, pattern.matches("a"));
		assertEquals(0, pattern.matches("abc"));
		assertEquals(0, pattern.matches("xabcxabc"));
		assertEquals(0, pattern.matches("xbc"));
	}
	
	@Test
	public void matches_Prefix_CaseInsensitive() {
		final SearchPattern pattern= createPattern(PREFIX_MATCH);
		
		pattern.setPattern("a");
		assertEquals(PREFIX_MATCH, pattern.matches("A"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(0, pattern.matches("xAbcxabc"));
		
		pattern.setPattern("A");
		assertEquals(PREFIX_MATCH, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(0, pattern.matches("xabcxabc"));
		
		pattern.setPattern("ab");
		assertEquals(0, pattern.matches("A"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("ABc"));
		assertEquals(PREFIX_MATCH, pattern.matches("aBc"));
		assertEquals(0, pattern.matches("xAbcxAbc"));
		assertEquals(0, pattern.matches("xABcxABc"));
		assertEquals(0, pattern.matches("xaBcxaBc"));
		
		pattern.setPattern("Ab");
		assertEquals(0, pattern.matches("A"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("ABc"));
		assertEquals(PREFIX_MATCH, pattern.matches("aBc"));
		assertEquals(0, pattern.matches("xabcxabc"));
		assertEquals(0, pattern.matches("xAbcxAbc"));
		assertEquals(0, pattern.matches("xABcxABc"));
		assertEquals(0, pattern.matches("xaBcxaBc"));
		
		pattern.setPattern("aB");
		assertEquals(0, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("ABc"));
		assertEquals(PREFIX_MATCH, pattern.matches("aBc"));
		assertEquals(0, pattern.matches("xabcxabc"));
		assertEquals(0, pattern.matches("xAbcxAbc"));
		assertEquals(0, pattern.matches("xABcxABc"));
		assertEquals(0, pattern.matches("xaBcxaBc"));
		
		pattern.setPattern("bc");
		assertEquals(0, pattern.matches("Abc"));
		assertEquals(0, pattern.matches("aBc"));
		assertEquals(0, pattern.matches("abC"));
		assertEquals(0, pattern.matches("xAbcxAbc"));
		assertEquals(0, pattern.matches("xaBcxaBc"));
		assertEquals(0, pattern.matches("xabCxabC"));
	}
	
	@Test
	public void matches_Substring() {
		final SearchPattern pattern= createPattern(SUBSTRING_MATCH);
		
		pattern.setPattern("");
		assertEquals(PREFIX_MATCH, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		
		pattern.setPattern("a");
		assertEquals(PREFIX_MATCH, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xabcxabc"));
		assertEquals(0, pattern.matches("xbc"));
		
		pattern.setPattern("ab");
		assertEquals(0, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xabcxabc"));
		assertEquals(0, pattern.matches("xbc"));
		
		pattern.setPattern("bc");
		assertEquals(0, pattern.matches("a"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("abc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xabcxabc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xbc"));
		assertEquals(0, pattern.matches("xbxc"));
	}
	
	@Test
	public void matches_Substring_CaseInsensitive() {
		final SearchPattern pattern= createPattern(SUBSTRING_MATCH);
		
		pattern.setPattern("a");
		assertEquals(PREFIX_MATCH, pattern.matches("A"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xAbcxabc"));
		
		pattern.setPattern("A");
		assertEquals(PREFIX_MATCH, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xabcxabc"));
		
		pattern.setPattern("ab");
		assertEquals(0, pattern.matches("A"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("ABc"));
		assertEquals(PREFIX_MATCH, pattern.matches("aBc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xAbcxAbc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xABcxABc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xaBcxaBc"));
		
		pattern.setPattern("Ab");
		assertEquals(0, pattern.matches("A"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("ABc"));
		assertEquals(PREFIX_MATCH, pattern.matches("aBc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xabcxabc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xAbcxAbc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xABcxABc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xaBcxaBc"));
		
		pattern.setPattern("aB");
		assertEquals(0, pattern.matches("a"));
		assertEquals(PREFIX_MATCH, pattern.matches("abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("Abc"));
		assertEquals(PREFIX_MATCH, pattern.matches("ABc"));
		assertEquals(PREFIX_MATCH, pattern.matches("aBc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xabcxabc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xAbcxAbc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xABcxABc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xaBcxaBc"));
		
		pattern.setPattern("bc");
		assertEquals(SUBSTRING_MATCH, pattern.matches("Abc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("aBc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("abC"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xAbcxAbc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xaBcxaBc"));
		assertEquals(SUBSTRING_MATCH, pattern.matches("xabCxabC"));
	}
	
	
	@Test
	public void getMatchingRegions_Prefix() {
		final SearchPattern pattern= createPattern(PREFIX_MATCH);
		
		pattern.setPattern("");
		assertNull(
				pattern.getMatchingRegions("a", PREFIX_MATCH) );
		assertNull(
				pattern.getMatchingRegions("abc", PREFIX_MATCH) );
		
		pattern.setPattern("a");
		assertArrayEquals(new int[] { 0, 1 },
				pattern.getMatchingRegions("a", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 1 },
				pattern.getMatchingRegions("abc", PREFIX_MATCH) );
		
		pattern.setPattern("ab");
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("abc", PREFIX_MATCH) );
	}
	
	@Test
	public void getMatchingRegions_Prefix_CaseInsensitive() {
		final SearchPattern pattern= createPattern(PREFIX_MATCH);
		
		pattern.setPattern("a");
		assertArrayEquals(new int[] { 0, 1 },
				pattern.getMatchingRegions("A", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 1 },
				pattern.getMatchingRegions("Abc", PREFIX_MATCH) );
		
		pattern.setPattern("A");
		assertArrayEquals(new int[] { 0, 1 },
				pattern.getMatchingRegions("a", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 1 },
				pattern.getMatchingRegions("abc", PREFIX_MATCH) );
		
		pattern.setPattern("ab");
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("Abc", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("aBc", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("ABc", PREFIX_MATCH) );
		
		pattern.setPattern("Ab");
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("abc", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("aBc", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("ABc", PREFIX_MATCH) );
		
		pattern.setPattern("aB");
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("abc", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("Abc", PREFIX_MATCH) );
		assertArrayEquals(new int[] { 0, 2 },
				pattern.getMatchingRegions("ABc", PREFIX_MATCH) );
	}
	
	@Test
	public void getMatchingRegions_Substring() {
		final SearchPattern pattern= createPattern(SUBSTRING_MATCH);
		
		pattern.setPattern("a");
		assertArrayEquals(new int[] { 1, 2, 5, 6 },
				pattern.getMatchingRegions("xabcxabc", SUBSTRING_MATCH) );
		
		pattern.setPattern("ab");
		assertArrayEquals(new int[] { 1, 3, 5, 7 },
				pattern.getMatchingRegions("xabcxabc", SUBSTRING_MATCH) );
		
		pattern.setPattern("bc");
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("abc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 2, 4, 6, 8 },
				pattern.getMatchingRegions("xabcxabc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("xbc", SUBSTRING_MATCH) );
	}
	
	@Test
	public void getMatchingRegions_Substring_CaseInsensitive() {
		final SearchPattern pattern= createPattern(SUBSTRING_MATCH);
		
		pattern.setPattern("a");
		assertArrayEquals(new int[] { 1, 2, 5, 6 },
				pattern.getMatchingRegions("xAbcxabc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 2, 5, 6 },
				pattern.getMatchingRegions("xabcxAbc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 2, 5, 6 },
				pattern.getMatchingRegions("xAbcxAbc", SUBSTRING_MATCH) );
		
		pattern.setPattern("A");
		assertArrayEquals(new int[] { 1, 2, 5, 6 },
				pattern.getMatchingRegions("xabcxabc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 2, 5, 6 },
				pattern.getMatchingRegions("xAbcxabc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 2, 5, 6 },
				pattern.getMatchingRegions("xabcxAbc", SUBSTRING_MATCH) );
		
		pattern.setPattern("ab");
		assertArrayEquals(new int[] { 1, 3, 5, 7 },
				pattern.getMatchingRegions("xAbcxaBc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 3, 5, 7 },
				pattern.getMatchingRegions("xABcxabc", SUBSTRING_MATCH) );
		
		pattern.setPattern("Ab");
		assertArrayEquals(new int[] { 1, 3, 5, 7 },
				pattern.getMatchingRegions("xAbcxaBc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 3, 5, 7 },
				pattern.getMatchingRegions("xABcxabc", SUBSTRING_MATCH) );
		
		pattern.setPattern("aB");
		assertArrayEquals(new int[] { 1, 3, 5, 7 },
				pattern.getMatchingRegions("xAbcxaBc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 3, 5, 7 },
				pattern.getMatchingRegions("xABcxabc", SUBSTRING_MATCH) );
		
		pattern.setPattern("bc");
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("abc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 2, 4, 6, 8 },
				pattern.getMatchingRegions("xabcxabc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("xbc", SUBSTRING_MATCH) );
		
		pattern.setPattern("Bc");
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("abC", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 2, 4, 6, 8 },
				pattern.getMatchingRegions("xabcxabC", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("xbC", SUBSTRING_MATCH) );
		
		pattern.setPattern("bC");
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("aBc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 2, 4, 6, 8 },
				pattern.getMatchingRegions("xabcxaBc", SUBSTRING_MATCH) );
		assertArrayEquals(new int[] { 1, 3 },
				pattern.getMatchingRegions("xBc", SUBSTRING_MATCH) );
	}
	
}
