// 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.code.debugging;
import com.google.collide.client.testing.MockAppContext;
import com.google.collide.client.util.PathUtil;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.util.JsonCollections;
import com.google.gwt.junit.client.GWTTestCase;
/**
* Tests for {@link DebuggingSidebarBreakpointsPane}.
*/
public class DebuggingSidebarBreakpointsPaneTest extends GWTTestCase {
private JsonArray<String> viewMessages;
private int breakpointCount;
private DebuggingSidebarBreakpointsPane debuggingSidebarBreakpointsPane;
@Override
protected void gwtSetUp() {
viewMessages = JsonCollections.createArray();
breakpointCount = 0;
DebuggingSidebarBreakpointsPane.View viewDecorator =
new DebuggingSidebarBreakpointsPane.View(new MockAppContext().getResources()) {
@Override
void addBreakpointSection(int sectionIndex) {
viewMessages.add("add section " + sectionIndex);
super.addBreakpointSection(sectionIndex);
}
@Override
void removeBreakpointSection(int sectionIndex) {
viewMessages.add("remove section " + sectionIndex);
super.removeBreakpointSection(sectionIndex);
}
@Override
void addBreakpoint(int sectionIndex, int breakpointIndex) {
++breakpointCount;
viewMessages.add("add breakpoint " + sectionIndex + ":" + breakpointIndex);
super.addBreakpoint(sectionIndex, breakpointIndex);
}
@Override
void removeBreakpoint(int sectionIndex, int breakpointIndex) {
--breakpointCount;
viewMessages.add("remove breakpoint " + sectionIndex + ":" + breakpointIndex);
super.removeBreakpoint(sectionIndex, breakpointIndex);
}
};
debuggingSidebarBreakpointsPane = new DebuggingSidebarBreakpointsPane(viewDecorator);
}
@Override
public String getModuleName() {
return "com.google.collide.client.TestCode";
}
public void testAddAndRemoveBreakpoint() {
assertAddBreakpoint("/js/foo.js", 10, "add section 0,add breakpoint 0:0");
assertEquals(1, breakpointCount);
assertRemoveBreakpoint("/js/foo.js", 10, "remove breakpoint 0:0,remove section 0");
assertEquals(0, breakpointCount);
}
public void testAddBreakpointsForOneFile() {
assertAddBreakpoint("/js/foo.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/js/foo.js", 20, "add breakpoint 0:1");
assertAddBreakpoint("/js/foo.js", 30, "add breakpoint 0:2");
assertAddBreakpoint("/js/foo.js", 5, "add breakpoint 0:0");
assertAddBreakpoint("/js/foo.js", 0, "add breakpoint 0:0");
assertAddBreakpoint("/js/foo.js", 15, "add breakpoint 0:3");
assertEquals(6, breakpointCount);
assertRemoveBreakpoint("/js/foo.js", 15, "remove breakpoint 0:3");
assertRemoveBreakpoint("/js/foo.js", 30, "remove breakpoint 0:4");
assertAddBreakpoint("/js/foo.js", 35, "add breakpoint 0:4");
assertRemoveBreakpoint("/js/foo.js", 5, "remove breakpoint 0:1");
assertRemoveBreakpoint("/js/foo.js", 0, "remove breakpoint 0:0");
assertRemoveBreakpoint("/js/foo.js", 35, "remove breakpoint 0:2");
assertRemoveBreakpoint("/js/foo.js", 10, "remove breakpoint 0:0");
assertRemoveBreakpoint("/js/foo.js", 20, "remove breakpoint 0:0,remove section 0");
assertEquals(0, breakpointCount);
}
public void testAddBreakpointsForUniqueFiles() {
assertAddBreakpoint("/a/c/foo4.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/a/c/foo6.js", 10, "add section 1,add breakpoint 1:0");
assertAddBreakpoint("/a/c/foo1.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/a/b/zzz4.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/a/d/aaa4.js", 10, "add section 4,add breakpoint 4:0");
assertEquals(5, breakpointCount);
assertRemoveBreakpoint("/a/c/foo6.js", 10, "remove breakpoint 3:0,remove section 3");
assertRemoveBreakpoint("/a/b/zzz4.js", 10, "remove breakpoint 0:0,remove section 0");
assertRemoveBreakpoint("/a/d/aaa4.js", 10, "remove breakpoint 2:0,remove section 2");
assertRemoveBreakpoint("/a/c/foo4.js", 10, "remove breakpoint 1:0,remove section 1");
assertRemoveBreakpoint("/a/c/foo1.js", 10, "remove breakpoint 0:0,remove section 0");
assertEquals(0, breakpointCount);
}
public void testAddBreakpointsForMixedFiles() {
assertAddBreakpoint("/js/foo.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/js/bar.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/js/foo.js", 20, "add breakpoint 1:1");
assertAddBreakpoint("/js/bar.js", 20, "add breakpoint 0:1");
assertAddBreakpoint("/js/foo.js", 30, "add breakpoint 1:2");
assertAddBreakpoint("/js/bar.js", 30, "add breakpoint 0:2");
assertEquals(6, breakpointCount);
assertRemoveBreakpoint("/js/bar.js", 20, "remove breakpoint 0:1");
assertRemoveBreakpoint("/js/foo.js", 10, "remove breakpoint 1:0");
assertRemoveBreakpoint("/js/bar.js", 10, "remove breakpoint 0:0");
assertRemoveBreakpoint("/js/bar.js", 30, "remove breakpoint 0:0,remove section 0");
assertRemoveBreakpoint("/js/foo.js", 20, "remove breakpoint 0:0");
assertRemoveBreakpoint("/js/foo.js", 30, "remove breakpoint 0:0,remove section 0");
assertEquals(0, breakpointCount);
}
public void testAddBreakpointsBetweenSections() {
assertAddBreakpoint("/js/bar.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/js/bar.js", 20, "add breakpoint 0:1");
assertAddBreakpoint("/js/bar.js", 30, "add breakpoint 0:2");
assertAddBreakpoint("/js/foo.js", 10, "add section 1,add breakpoint 1:0");
assertAddBreakpoint("/js/foo.js", 20, "add breakpoint 1:1");
assertAddBreakpoint("/js/foo.js", 30, "add breakpoint 1:2");
assertAddBreakpoint("/js/baz.js", 10, "add section 1,add breakpoint 1:0");
assertRemoveBreakpoint("/js/baz.js", 10, "remove breakpoint 1:0,remove section 1");
assertAddBreakpoint("/js/baa.js", 10, "add section 0,add breakpoint 0:0");
assertRemoveBreakpoint("/js/baa.js", 10, "remove breakpoint 0:0,remove section 0");
assertAddBreakpoint("/js/zoo.js", 10, "add section 2,add breakpoint 2:0");
assertRemoveBreakpoint("/js/zoo.js", 10, "remove breakpoint 2:0,remove section 2");
assertRemoveBreakpoint("/js/foo.js", 30, "remove breakpoint 1:2");
assertRemoveBreakpoint("/js/foo.js", 20, "remove breakpoint 1:1");
assertRemoveBreakpoint("/js/foo.js", 10, "remove breakpoint 1:0,remove section 1");
assertRemoveBreakpoint("/js/bar.js", 30, "remove breakpoint 0:2");
assertRemoveBreakpoint("/js/bar.js", 20, "remove breakpoint 0:1");
assertRemoveBreakpoint("/js/bar.js", 10, "remove breakpoint 0:0,remove section 0");
assertEquals(0, breakpointCount);
}
public void testAddBreakpointsInSubfolders() {
assertAddBreakpoint("/bar.js", 10, "add section 0,add breakpoint 0:0");
assertAddBreakpoint("/test.html", 10, "add section 1,add breakpoint 1:0");
assertAddBreakpoint("/test.js", 10, "add section 2,add breakpoint 2:0");
assertAddBreakpoint("/folder/foo.js", 10, "add section 3,add breakpoint 3:0");
assertAddBreakpoint("/folder/sub/zoo.js", 10, "add section 4,add breakpoint 4:0");
assertRemoveBreakpoint("/bar.js", 10, "remove breakpoint 0:0,remove section 0");
assertRemoveBreakpoint("/test.html", 10, "remove breakpoint 0:0,remove section 0");
assertRemoveBreakpoint("/test.js", 10, "remove breakpoint 0:0,remove section 0");
assertRemoveBreakpoint("/folder/foo.js", 10, "remove breakpoint 0:0,remove section 0");
assertRemoveBreakpoint("/folder/sub/zoo.js", 10, "remove breakpoint 0:0,remove section 0");
assertEquals(0, breakpointCount);
}
private void assertAddBreakpoint(String path, int lineNumber, String message) {
Breakpoint breakpoint = new Breakpoint.Builder(new PathUtil(path), lineNumber).build();
debuggingSidebarBreakpointsPane.addBreakpoint(breakpoint);
assertEquals(path + ":" + lineNumber, message, viewMessages.join(","));
assertEquals(path + ":" + lineNumber, breakpointCount,
debuggingSidebarBreakpointsPane.getBreakpointCount());
viewMessages.clear();
}
private void assertRemoveBreakpoint(String path, int lineNumber, String message) {
Breakpoint breakpoint = new Breakpoint.Builder(new PathUtil(path), lineNumber).build();
debuggingSidebarBreakpointsPane.removeBreakpoint(breakpoint);
assertEquals(path + ":" + lineNumber, message, viewMessages.join(","));
assertEquals(path + ":" + lineNumber, breakpointCount,
debuggingSidebarBreakpointsPane.getBreakpointCount());
viewMessages.clear();
}
}