/*******************************************************************************
 * Copyright (c) 2020 Martin Weber.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/

package org.eclipse.cdt.cmake.core.internal;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.cdt.cmake.core.internal.properties.CMakePropertiesBean;
import org.eclipse.cdt.cmake.core.properties.CMakeGenerator;
import org.junit.Test;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor;

/**
 * @author Martin Weber
 */
public class CMakePropertiesEvolutionTest {

	private static final String VALUE_OF_EVOLVED_PROPERTY = "value of evolvedProperty";

	/** Tests whether properties persisted by a previous version of our bundle can be loaded by
	 * a newer version of our bundle.
	 */
	@Test
	public void testSaveLoadEvolution_1() throws IOException {
		CMakePropertiesBean propsAtDefault = new CMakePropertiesBean();
		propsAtDefault.reset(true);

		CMakePropertiesBean props = new CMakePropertiesBean();
		props.setCacheFile("cacheFile");
		props.setClearCache(true);
		props.setDebugOutput(true);
		props.setDebugTryCompile(true);
		props.setTrace(true);
		props.setWarnNoDev(true);
		props.setWarnUnitialized(true);
		props.setWarnUnused(true);
		props.getLinuxOverrides().setGenerator(CMakeGenerator.Ninja);

		List<String> extraArgs = new ArrayList<>();
		extraArgs.add("arg1");
		extraArgs.add("arg2");
		props.setExtraArguments(extraArgs);

		Yaml yaml = new Yaml(new CustomClassLoaderConstructor(this.getClass().getClassLoader()));
		String output = yaml.dump(props);

		// try to load as evolved properties..
		CMakePropertiesBean_1 in = yaml.loadAs(output, CMakePropertiesBean_1.class);
		assertNotNull(in);
		assertEquals(CMakePropertiesEvolutionTest.VALUE_OF_EVOLVED_PROPERTY, in.getEvolvedProperty());
		assertThat(props).usingRecursiveComparison().isEqualTo(in);
	}

	private static class CMakePropertiesBean_1 extends CMakePropertiesBean {
		private String evolvedProperty;

		@Override
		public void reset(boolean resetOsOverrides) {
			super.reset(resetOsOverrides);
			evolvedProperty = CMakePropertiesEvolutionTest.VALUE_OF_EVOLVED_PROPERTY;
		}

		public String getEvolvedProperty() {
			return evolvedProperty;
		}

		public void setEvolvedProperty(String evolvedProperty) {
			this.evolvedProperty = evolvedProperty;
		}
	}
}
