/*******************************************************************************
 * Copyright (c) 2009, 2010 Nokia and others.
 * 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:
 * Nokia - Initial API and implementation
 *******************************************************************************/

package org.eclipse.cdt.debug.edc.debugger.tests;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.edc.tests.TestUtils;
import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.IDisassembly;
import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
import org.eclipse.cdt.dsf.debug.service.IMixedInstruction;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;

public class DisassemblyView extends BaseLaunchTest {

	/*
	 * NOTE: This is the source line and its corresponding code addresses in the
	 * test case program specified by EXEPATH environemnt variable.
	 * 
	 * The value below is for BlackFlagWascana.exe I built using Cygwin. Change
	 * them accordingly if you are using different binary file.
	 * 
	 * TODO: make it more flexible.
	 */
	static final String sSrcFile = "C:\\wascana\\workspace\\BlackFlagWascana\\src\\dbg_breakpoints.cpp";
	static final int sLineNumber = 82; // line in above source file.

	private IDisassembly disassembly;

	@Override
	protected boolean getStopAtMain() {
		return true;
	}

	@Before
	public void launch() throws Exception {
		basicLaunch();
	}

	@After
	public void shutdown() {
		TestUtils.shutdownDebugSession(launch, session);
		session = null;
	}

	@Test
	public void testDisassemblyView() throws Exception {
		getDsfDisassemblyService();
		assertNotNull(disassembly);

		final IDisassemblyDMContext disassemblyDMC
			= DMContexts.getAncestorOfType(threadDMC, IDisassemblyDMContext.class);
		assertNotNull(disassemblyDMC);

		// get assembly code by source file & line number
		//
		Query<IMixedInstruction[]> query1 = new Query<IMixedInstruction[]>() {
			@Override
			protected void execute(final DataRequestMonitor<IMixedInstruction[]> drm) {
				disassembly.getMixedInstructions(disassemblyDMC, sSrcFile, sLineNumber, 2, drm);
			}
		};
		session.getExecutor().execute(query1);

		IMixedInstruction[] result1 = query1.get();

		for (IMixedInstruction mi : result1)
			System.out.println(mi);

		final IAddress sStartAddress = waitGetLineAddress(sSrcFile, 82);
		final IAddress sEndAddress = waitGetLineAddress(sSrcFile, 83);

		// get assembly code by runtime address (same as logical address on
		// Windows & Linux)
		//
		Query<IMixedInstruction[]> query2 = new Query<IMixedInstruction[]>() {
			@Override
			protected void execute(final DataRequestMonitor<IMixedInstruction[]> drm) {
				disassembly.getMixedInstructions(disassemblyDMC, sStartAddress.getValue(),
						sEndAddress.getValue(), drm);
			}
		};
		session.getExecutor().execute(query2);

		IMixedInstruction[] result2 = query2.get();

		for (IMixedInstruction mi : result2)
			System.out.println(mi);

		assertEquals(result1[0].getLineNumber(), result2[0].getLineNumber());
		assertEquals(result1[0].getInstructions().length, result2[0].getInstructions().length);

		for (int i = 0; i < result1[0].getInstructions().length; i++)
			assertTrue(TestUtils.stringCompare(result1[0].getInstructions()[i].toString(),
					result2[0].getInstructions()[i].toString(), true, // ignoreCase,
					true, // ignoreWhite,
					false // ignore0x
					));
	}

	private void getDsfDisassemblyService() throws Exception {
		assertNotNull(session);	// this must be initialized already.
		
		TestUtils.waitOnExecutorThread(session, new Condition() {
			
			public boolean isConditionValid() {
				DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
				disassembly = servicesTracker.getService(IDisassembly.class);

				return true;
			}
		});
	}
}
