/**********************************************************************
 * Copyright (c) 2002,2003 Rational Software Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Common Public License v0.5
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors: 
 * IBM Rational Software - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.core.parser.tests;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;

import org.eclipse.cdt.core.parser.IPreprocessor;
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.NullSourceElementRequestor;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserFactory;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ast.IASTInclusion;
import org.eclipse.cdt.core.parser.ScannerInfo;

/**
 * @author jcamelon
 *
 */
public class PreprocessorTest extends TestCase {

	public static class Callback extends NullSourceElementRequestor
	{
		private List enteredInc = new ArrayList(), exitedInc = new ArrayList(); 
		
		public boolean asExpected( int balance )
		{
			return( ( enteredInc.size() - exitedInc.size() ) == balance ); 
		}

		/* (non-Javadoc)
		 * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterInclusion(org.eclipse.cdt.core.parser.ast.IASTInclusion)
		 */
		public void enterInclusion(IASTInclusion inclusion) {
			enteredInc.add( inclusion );
		}

		/* (non-Javadoc)
		 * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitInclusion(org.eclipse.cdt.core.parser.ast.IASTInclusion)
		 */
		public void exitInclusion(IASTInclusion inclusion) {
			exitedInc.add( inclusion );
		}
	}

	public PreprocessorTest( String name )
	{
		super( name );
	}
	
	public void testSimpleExample()
	{
		Callback c = new Callback(); 
		IPreprocessor p = setupPreprocessor( "#include <stdio.h>", 
			null, 	// NOTE -- to demonstrate simple example, this should be set up with the info from the 
					// build properties
			null, c );
		p.process(); 
		c.asExpected(0);
	}
	
	public IPreprocessor setupPreprocessor( String text, List includePaths, Map defns, ISourceElementRequestor rq )
	{
		IPreprocessor p = ParserFactory.createPreprocessor( new StringReader( text ), "test", new ScannerInfo( defns, 
				includePaths == null ? null : (String [])includePaths.toArray()), ParserMode.COMPLETE_PARSE, ParserLanguage.CPP, rq, null );
		return p; 
	}
}
