/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.debug.tests.breakpoint; import java.util.List; import junit.framework.TestCase; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.ILineBreakpoint; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsComparator; import org.eclipse.debug.tests.TestsPlugin; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.IValueDetailListener; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IEditorInput; /** * Test the ordering used in the breakpoints view. * * Using a special Comparator which sorts breakpoint texts like file:1, file:2 and file:11 in a numerical ordering. */ public class BreakpointOrderingTests extends TestCase { public BreakpointOrderingTests(String name) { super(name); } /** * Test only implementation of IBreakpoint. */ static class TestBreakpoint implements IBreakpoint { private final String fText; private IMarker fMarker = null; TestBreakpoint(String text) { this(text, IBreakpoint.BREAKPOINT_MARKER); } TestBreakpoint(String text, final String markerType) { fText = text; final IResource resource = ResourcesPlugin.getWorkspace().getRoot(); IWorkspaceRunnable wr = new IWorkspaceRunnable() { @Override public void run( IProgressMonitor monitor ) throws CoreException { // create the marker setMarker(resource.createMarker(markerType)); } }; try { ResourcesPlugin.getWorkspace().run( wr, null ); } catch ( CoreException e ) { fail("Unexpected exception: " + e.toString()); //$NON-NLS-1$ } } void ReportFailure(String msg) throws CoreException { throw new CoreException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, msg)); } String getText() { return fText; } @Override public void delete() throws CoreException { fMarker.delete(); } @Override public IMarker getMarker() { return fMarker; } @Override public String getModelIdentifier() { return "Test"; //$NON-NLS-1$ } @Override public boolean isEnabled() throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ return false; } @Override public boolean isPersisted() throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ return false; } @Override public boolean isRegistered() throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ return false; } @Override public void setEnabled(boolean enabled) throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ } @Override public void setMarker(IMarker marker) throws CoreException { assertTrue(fMarker == null && marker != null); fMarker = marker; } @Override public void setPersisted(boolean registered) throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ } @Override public void setRegistered(boolean registered) throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ } @Override public <T> T getAdapter(Class<T> adapter) { fail("not implemented in test"); //$NON-NLS-1$ return null; } } /** * Test only implementation of ILineBreakpoint. */ static class TestLineBreakpoint extends TestBreakpoint implements ILineBreakpoint { private final int fLineNum; TestLineBreakpoint(String text, int lineNum) { super(text, IBreakpoint.LINE_BREAKPOINT_MARKER); fLineNum = lineNum; } @Override public int getLineNumber() throws CoreException { return fLineNum; } @Override public int getCharEnd() throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ return 0; } @Override public int getCharStart() throws CoreException { fail("not implemented in test"); //$NON-NLS-1$ return 0; } } /** * Test only implementation of StructuredViewer. */ StructuredViewer fTestViewer = new StructuredViewer() { @Override public IBaseLabelProvider getLabelProvider() { return fDebugModelPres; } @Override protected Widget doFindInputItem(Object element) { fail("not implemented in test"); //$NON-NLS-1$ return null; } @Override protected Widget doFindItem(Object element) { fail("not implemented in test"); //$NON-NLS-1$ return null; } @Override protected void doUpdateItem(Widget item, Object element, boolean fullMap) { fail("not implemented in test"); //$NON-NLS-1$ } @Override protected List getSelectionFromWidget() { fail("not implemented in test"); //$NON-NLS-1$ return null; } @Override protected void internalRefresh(Object element) { fail("not implemented in test"); //$NON-NLS-1$ } @Override public void reveal(Object element) { fail("not implemented in test"); //$NON-NLS-1$ } @Override protected void setSelectionToWidget(List l, boolean reveal) { fail("not implemented in test"); //$NON-NLS-1$ } @Override public Control getControl() { fail("not implemented in test"); //$NON-NLS-1$ return null; }}; // Test debug model presentation for label text retrieval. IDebugModelPresentation fDebugModelPres = new IDebugModelPresentation() { @Override public void computeDetail(IValue value, IValueDetailListener listener) { fail("not implemented in test"); //$NON-NLS-1$ } @Override public Image getImage(Object element) { fail("not implemented in test"); //$NON-NLS-1$ return null; } @Override public String getText(Object element) { assertTrue("Unexpected element", element instanceof TestBreakpoint); //$NON-NLS-1$ return ((TestBreakpoint)element).getText(); } @Override public void setAttribute(String attribute, Object value) { fail("not implemented in test"); //$NON-NLS-1$ } @Override public void addListener(ILabelProviderListener listener) { fail("not implemented in test"); //$NON-NLS-1$ } @Override public void dispose() { fail("not implemented in test"); //$NON-NLS-1$ } @Override public boolean isLabelProperty(Object element, String property) { fail("not implemented in test"); //$NON-NLS-1$ return false; } @Override public void removeListener(ILabelProviderListener listener) { fail("not implemented in test"); //$NON-NLS-1$ } @Override public String getEditorId(IEditorInput input, Object element) { fail("not implemented in test"); //$NON-NLS-1$ return null; } @Override public IEditorInput getEditorInput(Object element) { fail("not implemented in test"); //$NON-NLS-1$ return null; }}; // Test vector with some UNIX paths TestBreakpoint[] createTestBreakpoints0() { TestBreakpoint[] fTestBps = { new TestBreakpoint(""), //$NON-NLS-1$ new TestBreakpoint("/file/text.c"), //$NON-NLS-1$ new TestBreakpoint("/file/text.c:1"), //$NON-NLS-1$ new TestLineBreakpoint("", 0), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c", 0), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c", 1), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:", 0), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:0", 0), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:1", 1), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:0002", 2), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:3xxx", 3), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:10xxx", 10), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:a_01", 1), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:a_01a", 1), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:a_09", 9), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:a_09a", 9), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:a_011", 11), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:a_011a", 11), //$NON-NLS-1$ new TestLineBreakpoint("/file/text.c:y", 0), //$NON-NLS-1$ }; return fTestBps; } // Check plain numbers TestBreakpoint[] createTestBreakpoints1() { TestBreakpoint[] fTestBps = { new TestLineBreakpoint("0", 0), //$NON-NLS-1$ new TestLineBreakpoint("1", 1), //$NON-NLS-1$ new TestLineBreakpoint("1_a", 1), //$NON-NLS-1$ new TestLineBreakpoint("001_b", 1), //$NON-NLS-1$ new TestLineBreakpoint("01_c", 1), //$NON-NLS-1$ new TestLineBreakpoint("3", 3), //$NON-NLS-1$ new TestLineBreakpoint("10", 10), //$NON-NLS-1$ new TestLineBreakpoint("11", 11), //$NON-NLS-1$ new TestLineBreakpoint("20", 20), //$NON-NLS-1$ new TestLineBreakpoint("110", 110), //$NON-NLS-1$ new TestLineBreakpoint("112", 112), //$NON-NLS-1$ new TestLineBreakpoint("112a", 112), //$NON-NLS-1$ new TestLineBreakpoint("112b", 112), //$NON-NLS-1$ }; return fTestBps; } // Test consistent behavior with leading 0's TestBreakpoint[] createTestBreakpoints2() { TestBreakpoint[] fTestBps = { new TestLineBreakpoint("0", 0), //$NON-NLS-1$ new TestLineBreakpoint("00", 0), //$NON-NLS-1$ new TestLineBreakpoint("0000", 0), //$NON-NLS-1$ new TestLineBreakpoint("0001", 1), //$NON-NLS-1$ new TestLineBreakpoint("0010", 10), //$NON-NLS-1$ new TestLineBreakpoint("1000", 1000), //$NON-NLS-1$ new TestLineBreakpoint("10000", 10000), //$NON-NLS-1$ }; return fTestBps; } // Test Win32 paths TestBreakpoint[] createTestBreakpoints3() { TestBreakpoint[] fTestBps = { new TestLineBreakpoint(":a", 0), //$NON-NLS-1$ new TestLineBreakpoint("c:\\file\\text.c:1", 1), //$NON-NLS-1$ new TestLineBreakpoint("c:\\file\\text.c:2", 2), //$NON-NLS-1$ new TestLineBreakpoint("d:\\file\\text.c:3", 3), //$NON-NLS-1$ }; return fTestBps; } public void testBreakpointOrdering0() throws CoreException { executeTest(createTestBreakpoints0()); } public void testBreakpointOrdering1() throws CoreException { executeTest(createTestBreakpoints1()); } public void testBreakpointOrdering2() throws CoreException { executeTest(createTestBreakpoints2()); } public void testBreakpointOrdering3() throws CoreException { executeTest(createTestBreakpoints3()); } /** * Test expected ordering. * Expecting the same ordering as in which the BP's are returned by createTestBreakpoints. */ void executeTest(TestBreakpoint[] testBps) throws CoreException { BreakpointsComparator bpCompare = new BreakpointsComparator(); try { boolean failed = false; for (int inner = 0; inner < testBps.length; inner++) { TestBreakpoint testInner = testBps[inner]; for (int outer = 0; outer < testBps.length; outer++) { TestBreakpoint testOuter = testBps[outer]; int res = bpCompare.compare(fTestViewer, testInner, testOuter); boolean equalCheck = (res == 0) == (inner == outer); boolean ltCheck = (res < 0) == (inner < outer); if (!equalCheck) { System.err.println("Equal Comparison in between " + inner + " and " + outer + " (" + testBps[inner].getText() + " and " + testBps[outer].getText() + ") failed"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ failed = true; } if (!ltCheck) { System.err.println("Less Comparison in between " + inner + " and " + outer + " (" + testBps[inner].getText() + " and " + testBps[outer].getText() + ") failed"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ failed = true; } } } assertFalse(failed); } finally { for (int index = 0; index < testBps.length; index++) { testBps[index].delete(); } } } }