/*******************************************************************************
 * Copyright (c) 2011 NumberFour AG
 *
 * 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
 *
 * Contributors:
 *     NumberFour AG - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.javascript.core.tests.typeinfo;

import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.dltk.javascript.core.Types;
import org.eclipse.dltk.javascript.typeinfo.ITypeNames;
import org.eclipse.dltk.javascript.typeinfo.TypeQuery;
import org.eclipse.dltk.javascript.typeinfo.model.Type;
import org.eclipse.dltk.javascript.typeinfo.model.TypeInfoModelFactory;

public class TypeQueryTests extends TestCase implements ITypeNames {

	private List<Type> toList(final Iterable<Type> iterable) {
		final List<Type> types = new ArrayList<Type>();
		for (Type type : iterable) {
			types.add(type);
		}
		return types;
	}

	public void testHierarchy() {
		final Type type = TypeInfoModelFactory.eINSTANCE.createType();
		type.getTraits().add(Types.STRING);
		type.getTraits().add(Types.NUMBER);
		final TypeQuery query = new TypeQuery(type);
		final List<Type> all = query.getHierarchy();
		assertEquals(4, all.size());
		assertSame(type, all.get(0));
		assertSame(Types.STRING, all.get(1));
		assertSame(Types.NUMBER, all.get(2));
		assertSame(Types.OBJECT, all.get(3));
	}

	public void testTraits() {
		final Type base = TypeInfoModelFactory.eINSTANCE.createType();
		base.getTraits().add(Types.STRING);
		base.getTraits().add(Types.NUMBER);
		final Type type = TypeInfoModelFactory.eINSTANCE.createType();
		type.setSuperType(base);
		type.getTraits().add(Types.NUMBER);
		final List<Type> traits = toList(new TypeQuery(type).getAllTraits());
		assertEquals(2, traits.size());
		assertSame(Types.NUMBER, traits.get(0));
		assertSame(Types.STRING, traits.get(1));
	}

	public void testTraits2() {
		final Type base = TypeInfoModelFactory.eINSTANCE.createType();
		base.getTraits().add(Types.STRING);
		base.getTraits().add(Types.NUMBER);
		final Type type = TypeInfoModelFactory.eINSTANCE.createType();
		type.setSuperType(base);
		final List<Type> traits = toList(new TypeQuery(type).getAllTraits());
		assertEquals(2, traits.size());
		assertSame(Types.STRING, traits.get(0));
		assertSame(Types.NUMBER, traits.get(1));
	}

}
