From aef5c15a1dedf47a4250313a071cc5342563613b Mon Sep 17 00:00:00 2001 From: RagnarW Date: Fri, 4 Mar 2016 13:46:54 +0100 Subject: [PATCH 1/7] Updated runners to store parameters --- .../v1/tck/tck/util/runners/CypherStatementRunner.java | 5 +++++ .../tck/tck/util/runners/MappedParametersRunner.java | 6 ++++++ .../v1/tck/tck/util/runners/StatementRunner.java | 9 +++++++++ .../driver/v1/tck/tck/util/runners/StringRunner.java | 10 ++++++++++ 4 files changed, 30 insertions(+) diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/CypherStatementRunner.java b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/CypherStatementRunner.java index 25c9a6ef18..d1591a8e72 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/CypherStatementRunner.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/CypherStatementRunner.java @@ -18,11 +18,16 @@ */ package org.neo4j.driver.v1.tck.tck.util.runners; +import java.util.Map; + import org.neo4j.driver.v1.ResultCursor; +import org.neo4j.driver.v1.Value; public interface CypherStatementRunner { CypherStatementRunner runCypherStatement(); ResultCursor result(); + + Map parameters(); } diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java index 70615e7c2e..5158eb967c 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java @@ -58,4 +58,10 @@ public ResultCursor result() { return result; } + + @Override + public Map parameters() + { + return parameters; + } } diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StatementRunner.java b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StatementRunner.java index b007f30278..bc8e739f15 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StatementRunner.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StatementRunner.java @@ -18,8 +18,11 @@ */ package org.neo4j.driver.v1.tck.tck.util.runners; +import java.util.Map; + import org.neo4j.driver.v1.ResultCursor; import org.neo4j.driver.v1.Statement; +import org.neo4j.driver.v1.Value; import static org.junit.Assert.assertNotNull; import static org.neo4j.driver.v1.tck.DriverComplianceIT.session; @@ -47,4 +50,10 @@ public ResultCursor result() { return result; } + + @Override + public Map parameters() + { + return statement.parameters(); + } } \ No newline at end of file diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StringRunner.java b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StringRunner.java index 6c538bee79..5c8ec32382 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StringRunner.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/StringRunner.java @@ -18,7 +18,11 @@ */ package org.neo4j.driver.v1.tck.tck.util.runners; +import java.util.HashMap; +import java.util.Map; + import org.neo4j.driver.v1.ResultCursor; +import org.neo4j.driver.v1.Value; import static org.junit.Assert.assertNotNull; import static org.neo4j.driver.v1.tck.DriverComplianceIT.session; @@ -46,4 +50,10 @@ public ResultCursor result() { return result; } + + @Override + public Map parameters() + { + return new HashMap<>( ); + } } \ No newline at end of file From a455e77a83392652cb737acec8cea2cc2e51c1df Mon Sep 17 00:00:00 2001 From: RagnarW Date: Fri, 4 Mar 2016 13:48:21 +0100 Subject: [PATCH 2/7] Updated util methods --- .../driver/v1/tck/tck/util/ResultParser.java | 50 +++++++++++++++---- .../neo4j/driver/v1/tck/tck/util/Types.java | 6 ++- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/ResultParser.java b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/ResultParser.java index 23ff0133d2..0a64a1ad10 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/ResultParser.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/ResultParser.java @@ -1,15 +1,15 @@ /** * Copyright (c) 2002-2016 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] - * + *

* This file is part of Neo4j. - * + *

* Licensed 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 - * + *

+ * 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. @@ -195,7 +195,7 @@ private static Collection getLabels( String input ) private static Map getProperties( String input ) { - Map result = getMapOfObjects( input ); + Map result = getMapOfObjects( input, false ); HashMap properties = new HashMap<>(); for ( String key : result.keySet() ) { @@ -298,6 +298,38 @@ else if ( TYPE_SYSTEM.PATH().isTypeOf( input ) ) } } + public static Object getJavaValueIntAsLong( String value ) + { + return getJavaValue( value, false ); + } + + public static Object getJavaValueNormalInts( String value ) + { + return getJavaValue( value, true ); + + } + + private static Object getJavaValue( String value, boolean normalInts ) + { + if ( isList( value ) ) + { + ArrayList values = new ArrayList<>(); + for ( String val : getList( value ) ) + { + values.add( Types.asObject( val ) ); + } + return values; + } + else if ( isMap( value ) ) + { + return getMapOfObjects( value, normalInts ); + } + else + { + return Types.asObject( value ); + } + } + public static Map parseExpected( Collection input, List keys ) { assertEquals( keys.size(), input.size() ); @@ -332,7 +364,7 @@ public static String[] getList( String resultValue ) return resultValue.substring( 1, resultValue.length() - 1 ).split( ", " ); } - public static Map getMapOfObjects( String input ) + public static Map getMapOfObjects( String input, boolean normalInts ) { Map properties = new HashMap<>(); int i1 = input.indexOf( "{" ); @@ -344,8 +376,8 @@ public static Map getMapOfObjects( String input ) input = input.substring( i1, i2 + 1 ); try { - ObjectMapper mapper = new ObjectMapper( ); - mapper.configure( DeserializationFeature.USE_LONG_FOR_INTS, true ); + ObjectMapper mapper = new ObjectMapper(); + mapper.configure( DeserializationFeature.USE_LONG_FOR_INTS, !normalInts ); properties = mapper.readValue( input, HashMap.class ); } catch ( IOException e ) diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/Types.java b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/Types.java index 619bbc60ad..a65ea8019c 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/Types.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/Types.java @@ -38,13 +38,17 @@ public static Type getType( String stringType ) throw new IllegalArgumentException( format( "There is no type: %s", stringType ) ); } - public static Object asObject(String object) + public static Object asObject( String object ) { return getTypeFromStringConstellation( object ).getJavaValue( object ); } public static Type getTypeFromStringConstellation( String object ) { + if ( object.length() == 0 ) + { + throw new IllegalArgumentException( "Cannot find matching type for expression: " + object ); + } if ( object.startsWith( "[:" ) && object.endsWith( "]" ) ) { return Type.Relationship; From 73688114fe2b41885d3d6e47d3e229fd2cd2d0d9 Mon Sep 17 00:00:00 2001 From: RagnarW Date: Fri, 4 Mar 2016 13:49:01 +0100 Subject: [PATCH 3/7] Added steps for EqualityFeature --- .../driver/v1/tck/DriverEqualitySteps.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 driver/src/test/java/org/neo4j/driver/v1/tck/DriverEqualitySteps.java diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverEqualitySteps.java b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverEqualitySteps.java new file mode 100644 index 0000000000..8cfacc3e5a --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverEqualitySteps.java @@ -0,0 +1,101 @@ +package org.neo4j.driver.v1.tck; + +import cucumber.api.java.en.And; +import cucumber.api.java.en.Then; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; + +import org.neo4j.driver.internal.InternalPath; +import org.neo4j.driver.internal.InternalRelationship; +import org.neo4j.driver.internal.value.PathValue; +import org.neo4j.driver.v1.Entity; +import org.neo4j.driver.v1.Identity; +import org.neo4j.driver.v1.Node; +import org.neo4j.driver.v1.Pair; +import org.neo4j.driver.v1.Path; +import org.neo4j.driver.v1.Record; +import org.neo4j.driver.v1.Relationship; +import org.neo4j.driver.v1.Value; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.neo4j.driver.v1.tck.DriverComplianceIT.session; + +public class DriverEqualitySteps +{ + HashMap savedValues = new HashMap<>(); + + @And( "^`(.*)` is single value result of: (.*)$" ) + public void valueIsSingleValueResultOfMATCHNLabelRETURNN( String key, String statement ) throws Throwable + { + Record r = session.run( statement ).single(); + assertThat( r.size(), equalTo( 1 ) ); + savedValues.put( key, r.get( 0 ) ); + } + + + @Then( "^saved values should all equal$" ) + public void savedValuesShouldAllEqual() throws Throwable + { + assertTrue( savedValues.values().size() > 1 ); + Collection values = savedValues.values(); + Iterator itr = values.iterator(); + Value v = itr.next(); + while ( itr.hasNext() ) + { + assertThat( v, equalTo( itr.next() ) ); + } + } + + @Then( "^none of the saved values should be equal$" ) + public void noneOfTheSavedValuesShouldBeEqual() throws Throwable + { + assertTrue( savedValues.values().size() > 1 ); + Collection values = savedValues.values(); + Iterator itr = values.iterator(); + Value v = itr.next(); + while ( itr.hasNext() ) + { + assertThat( v, not(equalTo( itr.next() ) ) ); + } + } + + @And( "^`(.*)` is a copy of `(.*)` path with flipped relationship direction$" ) + public void valueIsACopyOfValuePathWithFlippedRelationshipDirection( String key1, String key2 ) throws + Throwable + { + Path path = savedValues.get( key2 ).asPath(); + Iterable relationships = path.relationships(); + Iterator nodes= path.nodes().iterator(); + + ArrayList entities = new ArrayList<>( ); + entities.add( nodes.next() ); + + for ( Relationship rel : relationships ) + { + Identity id = rel.identity(); + Identity end = rel.start(); + Identity start = rel.end(); + HashMap properties = new HashMap<>(); + for ( Pair pair : rel.properties() ) + { + properties.put( pair.key(), pair.value() ); + } + entities.add( + new InternalRelationship( + id.asLong(), + start.asLong(), + end.asLong(), + rel.type(), + properties ) ); + entities.add( nodes.next() ); + } + Path newPath = new InternalPath( entities ); + savedValues.put( key1, new PathValue( newPath) ); + } +} From a36db5afc93ac12942c2ed3f35f25a47ae070f18 Mon Sep 17 00:00:00 2001 From: RagnarW Date: Fri, 4 Mar 2016 13:49:42 +0100 Subject: [PATCH 4/7] Added Result API steps --- .../driver/v1/tck/DriverResultApiSteps.java | 411 ++++++++++++++++++ 1 file changed, 411 insertions(+) create mode 100644 driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java new file mode 100644 index 0000000000..a0231035d2 --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java @@ -0,0 +1,411 @@ +package org.neo4j.driver.v1.tck; + +import cucumber.api.DataTable; +import cucumber.api.java.en.And; +import cucumber.api.java.en.Then; +import cucumber.api.java.en.When; +import cucumber.runtime.table.DiffableRow; +import org.hamcrest.CoreMatchers; +import org.hamcrest.core.IsInstanceOf; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.neo4j.driver.v1.InputPosition; +import org.neo4j.driver.v1.Notification; +import org.neo4j.driver.v1.Plan; +import org.neo4j.driver.v1.ProfiledPlan; +import org.neo4j.driver.v1.ResultSummary; +import org.neo4j.driver.v1.Statement; +import org.neo4j.driver.v1.StatementType; +import org.neo4j.driver.v1.UpdateStatistics; +import org.neo4j.driver.v1.Value; +import org.neo4j.driver.v1.tck.tck.util.runners.CypherStatementRunner; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.neo4j.driver.v1.tck.Environment.runners; +import static org.neo4j.driver.v1.tck.tck.util.ResultParser.getJavaValueIntAsLong; +import static org.neo4j.driver.v1.tck.tck.util.ResultParser.getJavaValueNormalInts; + +public class DriverResultApiSteps +{ + List summaries; + List statements; + + @When( "^the `Result Cursor` is summarized$" ) + public void the_result_is_summerized() throws Throwable + { + summaries = new ArrayList<>(); + for ( CypherStatementRunner runner : runners ) + { + summaries.add( runner.result().summarize() ); + } + } + + @Then( "^the `Result Cursor` is fully consumed$" ) + public void theResultCursorIsFullyConsumed() throws Throwable + { + for ( CypherStatementRunner runner : runners ) + { + assertThat( runner.result().list().isEmpty(), equalTo( true ) ); + assertThat( runner.result().atEnd(), equalTo( true ) ); + assertThat( runner.result().next(), equalTo( false ) ); + } + } + + @And( "^a `Result Summary` is returned$" ) + public void aResultSummaryIsReturned() throws Throwable + { + ResultSummary first = summaries.get( 0 ); + for ( ResultSummary resultSummary : summaries ) + { + assertThat( resultSummary, equalTo( first ) ); + } + } + + @And( "^I request a `statement` from the `Result Summary`$" ) + public void iRequestAStatementFromTheResultSummary() throws Throwable + { + statements = new ArrayList<>(); + for ( ResultSummary resultSummary : summaries ) + { + statements.add( resultSummary.statement() ); + } + } + + @Then( "^requesting the `Statement` as text should give: (.*)$" ) + public void requestingTheStatementAsTextShouldGive( String expected ) throws Throwable + { + for ( Statement statement : statements ) + { + assertThat( statement.template(), equalTo( expected ) ); + } + } + + @And( "^requesting the `Statement` parameter should give: (.*)$" ) + public void requestingTheStatementAsParameterShouldGiveNull( String expected ) throws Throwable + { + for ( int i = 0; i < statements.size(); i++ ) + { + assertThat( statements.get( i ).parameters(), equalTo( runners.get( i ).parameters() ) ); + } + } + + @Then( "^requesting `update statistics` from it should give$" ) + public void iShouldGetUpdateStatisticsContaining( DataTable expectedStatistics ) throws Throwable + { + for ( ResultSummary resultSummary : summaries ) + { + checkStatistics( resultSummary.updateStatistics(), tableToValueMap( expectedStatistics ) ); + } + } + + @Then( "^requesting the `Statement Type` should give (.*)$" ) + public void theStatementTypeShouldBeType( String expectedType ) throws Throwable + { + StatementType expected; + switch ( expectedType ) + { + case "read only": + expected = StatementType.READ_ONLY; + break; + case "write only": + expected = StatementType.WRITE_ONLY; + break; + case "read write": + expected = StatementType.READ_WRITE; + break; + case "schema write": + expected = StatementType.SCHEMA_WRITE; + break; + default: + throw new IllegalArgumentException( "Nu such type: " + expectedType ); + } + for ( ResultSummary summary : summaries ) + { + assertThat( summary.statementType(), equalTo( expected ) ); + } + } + + @Then( "^the summary has a `plan`$" ) + public void theSummaryHasAPlan() throws Throwable + { + for ( ResultSummary summary : summaries ) + { + assertThat( summary.hasPlan(), equalTo( true ) ); + } + } + + @Then( "^the summary does not have a `plan`$" ) + public void theSummaryDoesNotHaveAPlan() throws Throwable + { + for ( ResultSummary summary : summaries ) + { + assertThat( summary.hasPlan(), equalTo( false ) ); + } + } + + @Then( "^the summary has a `profile`$" ) + public void theSummaryHasAProfile() throws Throwable + { + for ( ResultSummary summary : summaries ) + { + assertThat( summary.hasProfile(), equalTo( true ) ); + } + } + + @And( "^the summary does not have a `profile`$" ) + public void theSummaryDoesNotHaveAPriofile() throws Throwable + { + for ( ResultSummary summary : summaries ) + { + assertThat( summary.hasProfile(), equalTo( false ) ); + } + } + + @Then( "^requesting the `plan` it contains$" ) + public void thePlanContains( DataTable expectedTable ) throws Throwable + { + HashMap expectedMap = tableToValueMap( expectedTable ); + for ( ResultSummary summary : summaries ) + { + checkPlansValues( expectedMap, summary.plan() ); + } + + } + + @Then( "^requesting the `profile` it contains:$" ) + public void theProfileContains( DataTable expectedTable ) throws Throwable + { + HashMap expectedMap = tableToValueMap( expectedTable ); + for ( ResultSummary summary : summaries ) + { + checkPlansValues( expectedMap, summary.profile() ); + } + } + + @And( "^the `plan` also contains method calls for:$" ) + public void alsoContainsMethodCallsFor( DataTable expectedTable ) throws Throwable + { + HashMap expectedMap = tableToMap( expectedTable ); + for ( ResultSummary summary : summaries ) + { + checkPlanMethods( expectedMap, summary.plan() ); + } + } + + @And( "^the `profile` also contains method calls for:$" ) + public void profileAlsoContainsMethodCallsFor( DataTable expectedTable ) throws Throwable + { + HashMap expectedMap = tableToMap( expectedTable ); + for ( ResultSummary summary : summaries ) + { + checkPlanMethods( expectedMap, summary.profile() ); + } + } + + @And( "^the summaries `notifications` is empty list$" ) + public void theSummaryDoesNotHaveAnyNotifications() throws Throwable + { + for ( ResultSummary summary : summaries ) + { + assertThat( summary.notifications().size(), equalTo( 0 ) ); + } + } + + @And( "^the summaries `notifications` has one notification with$" ) + public void theSummaryHasNotifications( DataTable table ) throws Throwable + { + HashMap expected = new HashMap<>(); + for ( int i = 1; i < table.diffableRows().size(); i++ ) + { + DiffableRow row = table.diffableRows().get( i ); + String key = row.convertedRow.get( 0 ); + Object value = getJavaValueNormalInts( row.convertedRow.get( 1 ) ); + expected.put( key, value ); + } + for ( ResultSummary summary : summaries ) + { + assertThat( summary.notifications().size() == 1, equalTo( true ) ); + Notification notification = summary.notifications().get( 0 ); + for ( String key : expected.keySet() ) + { + switch ( key ) + { + case "code": + assertThat( expected.get( key ), IsInstanceOf.instanceOf( notification.code().getClass() ) ); + assertThat( expected.get( key ), CoreMatchers.equalTo( notification.code() ) ); + break; + case "title": + assertThat( expected.get( key ), IsInstanceOf.instanceOf( notification.title().getClass() ) ); + assertThat( expected.get( key ), CoreMatchers.equalTo( notification.title() ) ); + break; + case "description": + assertThat( expected.get( key ), IsInstanceOf.instanceOf( notification.description().getClass() ) ); + assertThat( expected.get( key ), CoreMatchers.equalTo( notification.description() ) ); + break; + case "position": + Map expectedPosition = (Map) expected.get( key ); + InputPosition position = notification.position(); + for ( String positionKey : expectedPosition.keySet() ) + { + switch ( positionKey ) + { + case "offset": + assertThat( expectedPosition.get( positionKey ), + CoreMatchers.equalTo( position.offset() ) ); + break; + case "line": + assertThat( expectedPosition.get( positionKey ), + CoreMatchers.equalTo( position.line() ) ); + break; + case "column": + assertThat( expectedPosition.get( positionKey ), + CoreMatchers.equalTo( position.column() ) ); + break; + } + } + } + + } + } + } + + public HashMap tableToValueMap( DataTable table ) + { + HashMap map = new HashMap<>(); + for ( int i = 1; i < table.diffableRows().size(); i++ ) + { + List row = table.diffableRows().get( i ).convertedRow; + map.put( row.get( 0 ), getJavaValueIntAsLong( row.get( 1 ) ) ); + } + return map; + } + + public HashMap tableToMap( DataTable table ) + { + HashMap map = new HashMap<>(); + for ( int i = 1; i < table.diffableRows().size(); i++ ) + { + List row = table.diffableRows().get( i ).convertedRow; + map.put( row.get( 0 ), row.get( 1 ) ); + } + return map; + } + + private void checkPlansValues( HashMap expected, Plan p ) + { + for ( String key : expected.keySet() ) + { + Object givenValue; + switch ( key ) + { + case "identifiers": + givenValue = p.identifiers(); + break; + case "operator type": + givenValue = p.operatorType(); + break; + case "db hits": + assertThat( p, instanceOf( ProfiledPlan.class ) ); + givenValue = ((ProfiledPlan) p).dbHits(); + break; + case "records": + assertThat( p, instanceOf( ProfiledPlan.class ) ); + givenValue = ((ProfiledPlan) p).records(); + break; + default: + throw new IllegalArgumentException( "Nu such plan method: " + key ); + } + assertThat( key + "- does not match", givenValue, equalTo( expected.get( key ) ) ); + } + } + + private void checkPlanMethods( HashMap expected, Plan plan ) + { + for ( String key : expected.keySet() ) + { + switch ( key ) + { + case "children": + assertThat( plan.children(), instanceOf( List.class ) ); + for ( Plan p : plan.children() ) + { + assertThat( p, instanceOf( Plan.class ) ); + break; + } + break; + case "arguments": + assertThat( plan.arguments(), instanceOf( Map.class ) ); + for ( String k : plan.arguments().keySet() ) + { + assertThat( k, instanceOf( String.class ) ); + assertThat( plan.arguments().get( k ), instanceOf( Value.class ) ); + break; + } + break; + default: + throw new IllegalArgumentException( "There is no case for handeling method type: " + key ); + } + } + } + + private void checkStatistics( UpdateStatistics statistics, Map expectedStatisticsMap ) + { + for ( String key : expectedStatisticsMap.keySet() ) + { + Object expectedValue = expectedStatisticsMap.get( key ); + Object givenValue; + switch ( key ) + { + case "nodes created": + givenValue = statistics.nodesCreated(); + break; + case "nodes deleted": + givenValue = statistics.nodesDeleted(); + break; + case "relationships created": + givenValue = statistics.relationshipsCreated(); + break; + case "relationships deleted": + givenValue = statistics.relationshipsDeleted(); + break; + case "properties set": + givenValue = statistics.propertiesSet(); + break; + case "labels added": + givenValue = statistics.labelsAdded(); + break; + case "labels removed": + givenValue = statistics.labelsRemoved(); + break; + case "indexes added": + givenValue = statistics.indexesAdded(); + break; + case "indexes removed": + givenValue = statistics.indexesRemoved(); + break; + case "constraints added": + givenValue = statistics.constraintsAdded(); + break; + case "constraints removed": + givenValue = statistics.constraintsRemoved(); + break; + case "contains updates": + givenValue = statistics.containsUpdates(); + break; + default: + throw new IllegalArgumentException( "No function mapped to expression: " + key ); + } + if ( givenValue instanceof Integer ) + { + givenValue = Long.valueOf( (Integer) givenValue ); + } + assertThat( key + " - did not match", givenValue, equalTo( expectedValue ) ); + } + } +} From 7f4374440f941cfd4d5b9d11f6a0a90dd0bfee7f Mon Sep 17 00:00:00 2001 From: RagnarW Date: Fri, 4 Mar 2016 13:51:48 +0100 Subject: [PATCH 5/7] Temporarily runs in_dev files to show errors on TCK branch --- .../driver/v1/tck/DriverComplianceIT.java | 2 +- .../driver/v1/tck/DriverComplianceSteps.java | 41 ++++--------------- 2 files changed, 8 insertions(+), 35 deletions(-) diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java index 8b276031df..a330742819 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java @@ -30,7 +30,7 @@ * The base class to run all cucumber tests */ @RunWith( DriverCucumberAdapter.class ) -@CucumberOptions( features = {"target/resources/features"}, tags={"~@in_dev"}, format = {"pretty"}) +@CucumberOptions( features = {"target/resources/features"}, strict=true, tags={"~@db"}, format = {"pretty"}) public class DriverComplianceIT { @ClassRule diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceSteps.java b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceSteps.java index 88df03c6a1..d131948c7f 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceSteps.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceSteps.java @@ -35,7 +35,6 @@ import org.neo4j.driver.v1.Statement; import org.neo4j.driver.v1.Value; import org.neo4j.driver.v1.Values; -import org.neo4j.driver.v1.tck.tck.util.Types; import org.neo4j.driver.v1.tck.tck.util.runners.CypherStatementRunner; import org.neo4j.driver.v1.tck.tck.util.runners.MappedParametersRunner; import org.neo4j.driver.v1.tck.tck.util.runners.StatementRunner; @@ -53,10 +52,7 @@ import static org.neo4j.driver.v1.tck.Environment.runners; import static org.neo4j.driver.v1.tck.Environment.statementRunner; import static org.neo4j.driver.v1.tck.Environment.stringRunner; -import static org.neo4j.driver.v1.tck.tck.util.ResultParser.getList; -import static org.neo4j.driver.v1.tck.tck.util.ResultParser.getMapOfObjects; -import static org.neo4j.driver.v1.tck.tck.util.ResultParser.isList; -import static org.neo4j.driver.v1.tck.tck.util.ResultParser.isMap; +import static org.neo4j.driver.v1.tck.tck.util.ResultParser.getJavaValueIntAsLong; import static org.neo4j.driver.v1.tck.tck.util.Types.Type; import static org.neo4j.driver.v1.tck.tck.util.Types.getType; @@ -73,10 +69,9 @@ public void A_running_database() throws Throwable } @Given( "^a value (.*)$" ) - public void a_value( String value ) - throws Throwable + public void a_value( String value ) throws Throwable { - expectedJavaValue = getJavaValue( value ); + expectedJavaValue = getJavaValueIntAsLong( value ); expectedBoltValue = Values.value( expectedJavaValue ); } @@ -143,12 +138,12 @@ public void the_driver_asks_the_server_to_echo_this_map_back() throws Throwable } @Given( "^a list containing$" ) - public void a_list_containing( List table ) throws Throwable + public static void a_list_containing( List table ) throws Throwable { List content = table.subList( 1, table.size() - 1 ); for ( String value : content ) { - listOfObjects.add( getJavaValue( value ) ); + listOfObjects.add( getJavaValueIntAsLong( value ) ); } } @@ -159,14 +154,14 @@ public void adding_this_list_to_itself() throws Throwable } @Given( "^a map containing$" ) - public void a_map_containing( DataTable table ) throws Throwable + public static void a_map_containing( DataTable table ) throws Throwable { Map map = table.asMap( String.class, String.class ); for ( String key : map.keySet() ) { if ( !key.equals( "key" ) ) { - mapOfObjects.put( (String) Type.String.getJavaValue( key ), getJavaValue( map.get( key ) ) ); + mapOfObjects.put( (String) Type.String.getJavaValue( key ), getJavaValueIntAsLong( map.get( key ) ) ); } } } @@ -193,27 +188,6 @@ public void result_should_be_equal_to_a_single_Type_of_Input() throws Throwable } } - public Object getJavaValue( String value ) - { - if ( isList( value ) ) - { - ArrayList values = new ArrayList<>(); - for ( String val : getList( value ) ) - { - values.add( Types.asObject( val ) ); - } - return values; - } - else if ( isMap( value ) ) - { - return getMapOfObjects( value ); - } - else - { - return Types.asObject( value ); - } - } - public String getRandomString( long size ) { StringBuilder stringBuilder = new StringBuilder(); @@ -251,5 +225,4 @@ public boolean databaseRunning() { return session() != null; } - } From d72044dc2392eab59f03c4d6ccd7aaa73351f3f5 Mon Sep 17 00:00:00 2001 From: RagnarW Date: Wed, 16 Mar 2016 15:38:24 +0100 Subject: [PATCH 6/7] Added severtiy to notfications test in result api steps --- .../driver/v1/tck/DriverResultApiSteps.java | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java index 2e498551ba..a9c341f332 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverResultApiSteps.java @@ -1,15 +1,15 @@ /** * Copyright (c) 2002-2016 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] - *

+ * * This file is part of Neo4j. - *

+ * * Licensed 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 - *

+ * + * 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. @@ -257,16 +257,16 @@ public void theSummaryHasNotifications( DataTable table ) throws Throwable switch ( key ) { case "code": - assertThat( expected.get( key ), IsInstanceOf.instanceOf( notification.code().getClass() ) ); - assertThat( expected.get( key ), CoreMatchers.equalTo( notification.code() ) ); + compareNotificationValue( notification.code(), expected.get( key ) ); break; case "title": - assertThat( expected.get( key ), IsInstanceOf.instanceOf( notification.title().getClass() ) ); - assertThat( expected.get( key ), CoreMatchers.equalTo( notification.title() ) ); + compareNotificationValue( notification.title(), expected.get( key ) ); break; case "description": - assertThat( expected.get( key ), IsInstanceOf.instanceOf( notification.description().getClass() ) ); - assertThat( expected.get( key ), CoreMatchers.equalTo( notification.description() ) ); + compareNotificationValue( notification.description(), expected.get( key ) ); + break; + case "severity": + compareNotificationValue( notification.severity(), expected.get( key ) ); break; case "position": Map expectedPosition = (Map) expected.get( key ); @@ -276,25 +276,33 @@ public void theSummaryHasNotifications( DataTable table ) throws Throwable switch ( positionKey ) { case "offset": - assertThat( expectedPosition.get( positionKey ), - CoreMatchers.equalTo( position.offset() ) ); + compareNotificationValue( position.offset(), expectedPosition.get( positionKey ) ); break; case "line": - assertThat( expectedPosition.get( positionKey ), - CoreMatchers.equalTo( position.line() ) ); + compareNotificationValue( position.line(), expectedPosition.get( positionKey ) ); break; case "column": - assertThat( expectedPosition.get( positionKey ), - CoreMatchers.equalTo( position.column() ) ); + compareNotificationValue( position.column(), expectedPosition.get( positionKey ) ); break; } } + break; + default: + throw new IllegalArgumentException( "No case for " + key ); } + + } } } + private void compareNotificationValue(Object given, Object expected ) + { + assertThat( given, IsInstanceOf.instanceOf( expected.getClass() ) ); + assertThat( given, CoreMatchers.equalTo( expected ) ); + } + public HashMap tableToValueMap( DataTable table ) { HashMap map = new HashMap<>(); From 845cc773363cb3b6cd01b46f924df9aa0812281c Mon Sep 17 00:00:00 2001 From: RagnarW Date: Mon, 21 Mar 2016 13:20:51 +0100 Subject: [PATCH 7/7] Fixed cucumber tags --- .../test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java | 2 +- .../driver/v1/tck/tck/util/runners/MappedParametersRunner.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java index 98d1bdfba4..4c46078a96 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/DriverComplianceIT.java @@ -32,7 +32,7 @@ * The base class to run all cucumber tests */ @RunWith( DriverCucumberAdapter.class ) -@CucumberOptions( features = {"target/resources/features"}, strict=true, tags={"~@db"}, format = {"pretty"}) +@CucumberOptions( features = {"target/resources/features"}, strict=true, tags={"~@in_dev", "~@db"}, format = {"pretty"}) public class DriverComplianceIT { @ClassRule diff --git a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java index 8a8cdc04dd..943b66d13a 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java +++ b/driver/src/test/java/org/neo4j/driver/v1/tck/tck/util/runners/MappedParametersRunner.java @@ -33,7 +33,6 @@ public class MappedParametersRunner implements CypherStatementRunner { private String query; private Session session; - private String statement; private Value parameters; private StatementResult result; @@ -46,7 +45,6 @@ public MappedParametersRunner( String st, Map params ) { session = driver.session(); query = st; - statement = st; parameters = Values.value(params); }