/********************************************************************************
 * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.api.base.model;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Before;

public class ValueTypeTest {

	@Before
	public void init() {
		EnumRegistry.getInstance();
	}

	@org.junit.Test
	public void testExtractStringFromUnknown() {
		Value v = ValueType.UNKNOWN.create("Name", "abcd");

		assertThat((String) v.extract()).isEqualTo("abcd");
		assertThat(v.extract(ValueType.UNKNOWN)).isEqualTo("abcd");
	}

	@org.junit.Test
	public void testExtractString() {
		Value v = ValueType.STRING.create("Name", "abcd");

		assertThat((String) v.extract()).isEqualTo("abcd");
		assertThat(v.extract(ValueType.STRING)).isEqualTo("abcd");
	}

	@org.junit.Test
	public void testExtractInteger() {
		Value v = ValueType.INTEGER.create("Id", 1);

		assertThat((int) v.extract()).isEqualTo(1);
		assertThat(v.extract(ValueType.INTEGER)).isEqualTo(1);
	}

	@org.junit.Test
	public void testExtractIntegerSequence() {
		int[] ints = new int[] { 1, 2, 3 };

		Value v = ValueType.INTEGER_SEQUENCE.create("Ids", ints);

		assertThat((int[]) v.extract()).isEqualTo(ints);
		assertThat(v.extract(ValueType.INTEGER_SEQUENCE)).isEqualTo(ints);
	}

	@org.junit.Test
	public void testExtractEnumeration() {
		Value v = ValueType.ENUMERATION.create("ScalarTypeField", "", true, ScalarType.INTEGER,
				EnumRegistry.SCALAR_TYPE);

		assertThat(v.extract(ValueType.ENUMERATION)).isEqualTo(ScalarType.INTEGER);
	}

	@org.junit.Test
	public void testExtractEnumerationSequence() {
		ScalarType[] scalaTypes = new ScalarType[] { ScalarType.FLOAT, ScalarType.INTEGER };

		Value v = ValueType.ENUMERATION_SEQUENCE.create("ScalarTypeSeqField", "", true, scalaTypes,
				EnumRegistry.SCALAR_TYPE);

		assertThat(v.extract(ValueType.ENUMERATION_SEQUENCE)).isEqualTo(scalaTypes);
	}
}
