/******************************************************************************* * Copyright (c) 2017 Rogue Wave Software Inc. 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: * Rogue Wave Software Inc. - initial implementation *******************************************************************************/ package org.eclipse.php.phpunit.model.providers; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.php.phpunit.model.elements.PHPUnitTestCase; import org.eclipse.php.phpunit.model.elements.PHPUnitTestException; public class PHPUnitTestDiffTreeContentProvider extends ArrayContentProvider implements ITreeContentProvider { private String diff; @Override public Object[] getChildren(final Object parentElement) { if (parentElement instanceof DiffLine) { return ((DiffLine) parentElement).getChildren().toArray(); } else { final List<DiffLine> results = new ArrayList<>(); if (parentElement instanceof PHPUnitTestCase) { getCaseChildren((PHPUnitTestCase) parentElement, results); } return results.toArray(); } } private void getCaseChildren(final PHPUnitTestCase testCase, final List<DiffLine> results) { final PHPUnitTestException exception = testCase.getException(); if (hasChildren(testCase)) { final DiffLine testDiffLine = new DiffLine(exception.getMessage(), null); results.add(testDiffLine); String[] children = exception.getDiff().split("\n"); //$NON-NLS-1$ Stack<DiffLine> parentStack = new Stack<>(); parentStack.push(testDiffLine); DiffLine diffLine; for (String child : children) { diffLine = new DiffLine(child, parentStack.peek()); if (child.endsWith(" Object (") || child.endsWith(" Array (")) { //$NON-NLS-1$ //$NON-NLS-2$ parentStack.push(diffLine); } else if (")".equals(child.trim()) && parentStack.size() > 1) { //$NON-NLS-1$ parentStack.pop(); } } } } @Override public Object[] getElements(final Object inputElement) { return getChildren(inputElement); } @Override public Object getParent(final Object element) { if (element instanceof DiffLine) { return ((DiffLine) element).getParent(); } return null; } @Override public boolean hasChildren(final Object element) { if (element instanceof PHPUnitTestCase) { final PHPUnitTestException exception = ((PHPUnitTestCase) element).getException(); if (exception == null) { return false; } diff = exception.getDiff(); return diff != null && !diff.isEmpty(); } else if (element instanceof DiffLine) { return !((DiffLine) element).getChildren().isEmpty(); } return false; } public String getDiff() { return diff; } }