/*=============================================================================#
 # Copyright (c) 2020, 2021 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.collections;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import static org.eclipse.statet.jcommons.collections.CollectionTests.A_notIdentical;
import static org.eclipse.statet.jcommons.collections.CollectionTests.B_notIdentical;

import java.util.Arrays;
import java.util.Set;

import org.junit.jupiter.api.Test;

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


@NonNullByDefault
public abstract class AbstractMutableSetTest<T extends Set<String>> extends AbstractSetTest<T> {
	
	
	public AbstractMutableSetTest(final Class<?> type) {
		super(type);
	}
	
	
	@Test
	public void add() {
		boolean r;
		
		this.c= createEmptyCollection();
		assertCollectionEmpty();
		
		r= this.c.add("A");
		assertCollectionEquals("A");
		assertTrue(r);
		
		r= this.c.add("B");
		assertCollectionEquals("A", "B");
		assertTrue(r);
		
		r= this.c.add("A");
		assertCollectionEquals("A", "B");
		assertFalse(r);
	}
	
	@Test
	public void add_notIdentical() {
		boolean r;
		
		this.c= createCollection("A", "B");
		assertCollectionEquals("A", "B");
		
		r= this.c.add(A_notIdentical);
		if (this.isIdentityCollection) {
			assertCollectionEquals("A", "B", A_notIdentical);
			assertTrue(r);
		}
		else {
			assertCollectionEquals("A", "B");
			assertFalse(r);
		}
	}
	
	@Test
	public void addAll() {
		boolean r;
		
		this.c= createEmptyCollection();
		assertCollectionEmpty();
		
		r= this.c.addAll(Arrays.asList("A", "B"));
		assertCollectionEquals("A", "B");
		assertTrue(r);
		
		r= this.c.addAll(Arrays.asList("A", "B"));
		assertCollectionEquals("A", "B");
		assertFalse(r);
		
		r= this.c.addAll(Arrays.asList("C", "D"));
		assertCollectionEquals("A", "B", "C", "D");
		assertTrue(r);
		
		r= this.c.addAll(Arrays.asList());
		assertCollectionEquals("A", "B", "C", "D");
		assertFalse(r);
		
		r= this.c.addAll(Arrays.asList("A", "B", "E", "F", "A", "B", "E", "F"));
		assertCollectionEquals("A", "B", "C", "D", "E", "F");
		assertTrue(r);
	}
	
	@Test
	public void addAll_notIdentical() {
		boolean r;
		
		this.c= createCollection("A", "B");
		
		r= this.c.addAll(Arrays.asList(A_notIdentical, B_notIdentical));
		if (this.isIdentityCollection) {
			assertCollectionEquals("A", "B", A_notIdentical, B_notIdentical);
			assertTrue(r);
		}
		else {
			assertCollectionEquals("A", "B");
			assertFalse(r);
		}
	}
	
	@Test
	public void retainAll() {
		boolean r;
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList("B", "C", "D"));
		assertCollectionEquals("B", "C", "D");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList("X", "B", "C", "C", "D", "X"));
		assertCollectionEquals("B", "C", "D");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList("D", "C", "A"));
		assertCollectionEquals("A", "C", "D");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList("A"));
		assertCollectionEquals("A");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList("F"));
		assertCollectionEquals("F");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList("X"));
		assertCollectionEmpty();
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList());
		assertCollectionEmpty();
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList("F", "B", "C", "D", "E", "A"));
		assertCollectionEquals("A", "B", "C", "D", "E", "F");
		assertFalse(r);
	}
	
	@Test
	public void retainAll_notIdentical() {
		boolean r;
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.retainAll(Arrays.asList(A_notIdentical, "B", B_notIdentical, "D"));
		if (this.isIdentityCollection) {
			assertCollectionEquals("B", "D");
			assertTrue(r);
		}
		else {
			assertCollectionEquals("A", "B", "D");
			assertTrue(r);
		}
	}
	
	@Test
	public void remove() {
		boolean r;
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.remove("B");
		assertCollectionEquals("A", "C", "D", "E", "F");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.remove("A");
		assertCollectionEquals("B", "C", "D", "E", "F");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.remove("F");
		assertCollectionEquals("A", "B", "C", "D", "E");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.remove("X");
		assertCollectionEquals("A", "B", "C", "D", "E", "F");
		assertFalse(r);
		
		this.c= createCollection("A");
		r= this.c.remove("A");
		assertCollectionEmpty();
		assertTrue(r);
		
		r= this.c.remove("X");
		assertCollectionEmpty();
		assertFalse(r);
	}
	
	@Test
	public void remove_notIdentical() {
		boolean r;
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.remove(B_notIdentical);
		if (this.isIdentityCollection) {
			assertCollectionEquals("A", "B", "C", "D", "E", "F");
			assertFalse(r);
		}
		else {
			assertCollectionEquals("A", "C", "D", "E", "F");
			assertTrue(r);
		}
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.remove(A_notIdentical);
		if (this.isIdentityCollection) {
			assertCollectionEquals("A", "B", "C", "D", "E", "F");
			assertFalse(r);
		}
		else {
			assertCollectionEquals("B", "C", "D", "E", "F");
			assertTrue(r);
		}
	}
	
	@Test
	public void removeAll() {
		boolean r;
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList("B", "C", "D"));
		assertCollectionEquals("A", "E", "F");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList("X", "B", "C", "C", "D", "X"));
		assertCollectionEquals("A", "E", "F");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList("D", "C", "A"));
		assertCollectionEquals("B", "E", "F");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList("A"));
		assertCollectionEquals("B", "C", "D", "E", "F");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList("F"));
		assertCollectionEquals("A", "B", "C", "D", "E");
		assertTrue(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList("X"));
		assertCollectionEquals("A", "B", "C", "D", "E", "F");
		assertFalse(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList());
		assertCollectionEquals("A", "B", "C", "D", "E", "F");
		assertFalse(r);
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList("A", "B", "C", "D", "E", "F"));
		assertCollectionEmpty();
		assertTrue(r);
		
		this.c= createCollection("A");
		r= this.c.removeAll(Arrays.asList("A", "B", "C", "D", "E", "F"));
		assertCollectionEmpty();
		assertTrue(r);
	}
	
	@Test
	public void removeAll_notIdentical() {
		boolean r;
		
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		r= this.c.removeAll(Arrays.asList(A_notIdentical, "B", B_notIdentical, "D"));
		if (this.isIdentityCollection) {
			assertCollectionEquals("A", "C", "E", "F");
			assertTrue(r);
		}
		else {
			assertCollectionEquals("C", "E", "F");
			assertTrue(r);
		}
	}
	
	@Test
	public void clear() {
		this.c= createCollection("A", "B", "C", "D", "E", "F");
		this.c.clear();
		assertCollectionEmpty();
		
		this.c.clear();
		assertCollectionEmpty();
	}
	
}
