/*******************************************************************************
 * Copyright (c) 2016 Obeo.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.eef.tests.internal.controllers;

import java.util.concurrent.atomic.AtomicBoolean;

import org.eclipse.eef.EEFLabelDescription;
import org.eclipse.eef.core.api.controllers.IEEFLabelController;
import org.eclipse.eef.core.internal.controllers.EEFLabelController;
import org.eclipse.eef.tests.internal.EEFDataTests;
import org.eclipse.emf.ecore.EClassifier;
import org.junit.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

import static org.junit.Assert.assertTrue;

/**
 * Unit tests for the {@link IEEFLabelController}.
 *
 * @author sbegaudeau
 */
@SuppressWarnings({ "checkstyle:javadocmethod" })
public class EEFLabelControllerTests extends AbstractEEFControllerTests {
	/**
	 * The name of the Project EClass.
	 */
	private static final String PROJECT_ECLASS_NAME = "Project"; //$NON-NLS-1$

	private IEEFLabelController labelController(String modelPath) {
		EClassifier eClassifier = this.ePackage(DART_ECORE, 0).getEClassifier(PROJECT_ECLASS_NAME);
		EEFLabelDescription description = widget(group(page(modelPath, 0), 0), EEFLabelDescription.class, 0);
		return new EEFLabelController(description, newVariableManager(eClassifier), this.interpreter);
	}

	@Test
	public void testLabel() {
		testLabel(labelController(EEFDataTests.EEFLABELCONTROLLERTESTS_LABEL), "Documentation:"); //$NON-NLS-1$
	}

	@Test
	public void testHelp() {
		testHelp(labelController(EEFDataTests.EEFLABELCONTROLLERTESTS_HELP), "Documentation Help"); //$NON-NLS-1$
	}

	@Test
	public void testBody() {
		AtomicBoolean atomicBoolean = new AtomicBoolean(false);
		IEEFLabelController controller = this.labelController(EEFDataTests.EEFLABELCONTROLLERTESTS_BODY);
		controller.onNewValue(label -> {
			assertThat(label, is("This is the documentation of the project")); //$NON-NLS-1$
			atomicBoolean.set(true);
		});
		controller.refresh();
		assertTrue(atomicBoolean.get());
	}
}
