/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.rdf.model.test.helpers; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.apache.jena.graph.test.GraphTestBase ; import org.apache.jena.rdf.model.Model ; import org.apache.jena.rdf.model.ModelChangedListener ; import org.apache.jena.rdf.model.Statement ; import org.apache.jena.rdf.model.StmtIterator ; import org.junit.Assert; /** * Class to listen to model changes and record them for testing. */ public class RecordingModelListener implements ModelChangedListener { List<Object> history = new ArrayList<>(); @Override public void addedStatement( final Statement s ) { record("add", s); } @Override public void addedStatements( final List<Statement> statements ) { record("addList", statements); } @Override public void addedStatements( final Model m ) { record("addModel", m); } @Override public void addedStatements( final Statement[] statements ) { record("add[]", Arrays.asList(statements)); } @Override public void addedStatements( final StmtIterator statements ) { record("addIterator", GraphTestBase.iteratorToList(statements)); } public void assertHas( final List<?> things ) { if (has(things) == false) { Assert.fail("expected " + things + " but got " + history); } } public void assertHas( final Object[] things ) { if (has(things) == false) { Assert.fail("expected " + Arrays.asList(things) + " but got " + history); } } public void assertHasEnd( final Object[] end ) { final List<Object> L = Arrays.asList(end); if (hasEnd(L) == false) { Assert.fail("expected " + L + " at the end of " + history); } } public void assertHasStart( final Object[] start ) { final List<Object> L = Arrays.asList(start); if (hasStart(L) == false) { Assert.fail("expected " + L + " at the beginning of " + history); } } @SuppressWarnings("unchecked") public static boolean checkEquality( final Object o1, final Object o2) { if (o1 == o2) { return true; } if (o1.getClass().isArray() && o2.getClass().isArray()) { final Object[] o1a = (Object[])o1; final Object[] o2a = (Object[])o2; if (o1a.length == o2a.length) { for (int i=0;i<o1a.length;i++) { if (!checkEquality( o1a[i], o2a[i])) { return false; } } return true; } return false; } else if ( (o1 instanceof Collection<?>) && (o2 instanceof Collection<?>) ) { return checkEquality( ((Collection<Object>)o1).toArray(), ((Collection<Object>)o2).toArray() ); } else if ((o1 instanceof Model) && (o2 instanceof Model)) { return checkEquality( ((Model)o1).listStatements().toList(), ((Model)o2).listStatements().toList()); } else if ((o1 instanceof Statement) && (o2 instanceof Statement)) { return checkEquality( ((Statement)o1).asTriple(), ((Statement)o2).asTriple()); } else { return o1.equals(o2); } } public void clear() { history.clear(); } public boolean has( final List<?> things ) { return has(things.toArray()); } public boolean has( final Object[] things ) { return checkEquality(history.toArray(), things); } public boolean hasEnd( final List<Object> L ) { return (L.size() <= history.size()) && checkEquality(L, history.subList(history.size() - L.size(), history.size())); } public boolean hasStart( final List<Object> L ) { return (L.size() <= history.size()) && checkEquality(L, history.subList(0, L.size())); } @Override public void notifyEvent( final Model m, final Object event ) { record("someEvent", m, event); } protected void record( final String tag, final Object info ) { history.add(tag); history.add(info); } protected void record( final String tag, final Object x, final Object y ) { history.add(tag); history.add(x); history.add(y); } @Override public void removedStatement( final Statement s ) { record("remove", s); } @Override public void removedStatements( final List<Statement> statements ) { record("removeList", statements); } @Override public void removedStatements( final Model m ) { record("removeModel", m); } @Override public void removedStatements( final Statement[] statements ) { record("remove[]", Arrays.asList(statements)); } @Override public void removedStatements( final StmtIterator statements ) { record("removeIterator", GraphTestBase.iteratorToList(statements)); } }