// Copyright 2012 Google Inc. All Rights Reserved. // // 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 // // 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 com.google.collide.client.testing; import com.google.collide.client.testing.CollideDtoClientTestingImpls.ComplexDtoImpl; import com.google.collide.client.testing.CollideDtoClientTestingImpls.MockNestedDtoResponseImpl; import com.google.collide.client.testing.CollideDtoClientTestingImpls.NestedDtoResponseImpl; import com.google.collide.client.testing.CollideDtoClientTestingImpls.SimpleDtoImpl; import com.google.collide.client.testing.dto.ComplexDto; import com.google.collide.client.testing.dto.SimpleDto; import com.google.collide.dto.client.DtoClientImpls.CreateProjectImpl; import com.google.collide.dto.client.DtoClientImpls.CreateWorkspaceImpl; import com.google.collide.json.client.JsoArray; import com.google.collide.json.client.JsoStringMap; import com.google.gwt.junit.client.GWTTestCase; /** * */ public class ExpectationTest extends GWTTestCase { private static final String NAME = "SomeName"; private static final String OTHER = "Other"; /** * Some syntactic sugar for asserting a happy {@link FrontendExpectation#checkMatch}. * * @param checkResult */ private void assertCheckOkay(String checkResult) { assertEquals("", checkResult); } /** * Checks that a given {@link FrontendExpectation#checkMatch} result contains the * expected failure as a substring. */ private void assertCheckFails(String substring, String checkResult) { assertTrue("expected \"" + substring + "\" does not occur in \"" + checkResult + "\"", checkResult.contains(substring)); } @Override public String getModuleName() { return "com.google.collide.client.Collide"; } public void testCheckMatchSimple() { // simple cases: same object, same type different fields, different types assertCheckOkay(FrontendExpectation.checkMatch( CreateProjectImpl.make().setName(NAME), CreateProjectImpl.make().setName(NAME))); assertCheckFails("field name does not match", FrontendExpectation.checkMatch( CreateProjectImpl.make().setName(NAME), CreateProjectImpl.make().setName(OTHER))); assertCheckFails("field _type does not match", FrontendExpectation.checkMatch( CreateProjectImpl.make().setName(NAME), CreateWorkspaceImpl.make().setName(NAME))); } public void testCheckMatchPartial() { // partial pattern matching: ignore the extra project id assertCheckOkay(FrontendExpectation.checkMatch(CreateWorkspaceImpl.make().setName(NAME), CreateWorkspaceImpl.make().setName(NAME).setProjectId(OTHER))); // but not the reverse: assertCheckFails("field projectId does not match", FrontendExpectation.checkMatch(CreateWorkspaceImpl.make().setName(NAME).setProjectId(OTHER), CreateWorkspaceImpl.make().setName(NAME))); } public void testCheckMatchCompound() { // validating deep recursion // Different parents, same children. JsoArray<ComplexDto> parents = JsoArray.create(); ComplexDto parent = ComplexDtoImpl.make().setId(NAME); parents.add(parent); JsoStringMap<SimpleDto> childMap = JsoStringMap.create(); childMap.put("child1", SimpleDtoImpl.make().setName("c1-name").setValue("c1-value")); childMap.put("child2", SimpleDtoImpl.make().setName("c2-name").setValue("c2-value")); parent = ComplexDtoImpl.make().setId(OTHER).setMap(childMap); parents.add(parent); NestedDtoResponseImpl two = MockNestedDtoResponseImpl.make().setArray(parents); // Different parents, different children. parents = JsoArray.create(); childMap = JsoStringMap.create(); parent = ComplexDtoImpl.make().setId(NAME).setMap(childMap); parents.add(parent); childMap = JsoStringMap.create(); childMap.put("child3", SimpleDtoImpl.make().setName("c3-name").setValue("c3-value")); childMap.put("child4", SimpleDtoImpl.make().setName("c4-name").setValue("c4-value")); parent = ComplexDtoImpl.make().setId(OTHER).setMap(childMap); parents.add(parent); NestedDtoResponseImpl twoDifferent = MockNestedDtoResponseImpl.make().setArray(parents); // One parent, no children. parents = JsoArray.create(); childMap = JsoStringMap.create(); parent = ComplexDtoImpl.make().setId(OTHER).setMap(childMap); parents.add(parent); NestedDtoResponseImpl oneOfZero = MockNestedDtoResponseImpl.make().setArray(parents); // One parent, two children. parents = JsoArray.create(); childMap = JsoStringMap.create(); childMap.put("child1", SimpleDtoImpl.make().setName("c1-name").setValue("c1-value")); childMap.put("child2", SimpleDtoImpl.make().setName("c2-name").setValue("c2-value")); parent = ComplexDtoImpl.make().setId(NAME).setMap(childMap); parents.add(parent); NestedDtoResponseImpl oneOfSome = MockNestedDtoResponseImpl.make().setArray(parents); assertCheckOkay(FrontendExpectation.checkMatch(two, two)); assertCheckFails("", FrontendExpectation.checkMatch(oneOfZero, oneOfSome)); assertCheckFails("field child1 is not an object, but undefined, " + "field child2 is not an object, but undefined", FrontendExpectation.checkMatch(oneOfSome, oneOfZero)); assertCheckFails("field child1 is not an object, but undefined, " + "field child2 is not an object, but undefined", FrontendExpectation.checkMatch(two, twoDifferent)); } }