blob: 71b50c40a761c41785c5d80583ccb8ac72d8b9a2 [file] [log] [blame]
/*
* 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.netbeans.modules.templatesui;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.openide.WizardDescriptor;
import org.openide.WizardValidationException;
import org.openide.util.Exceptions;
import org.openide.util.RequestProcessor;
/**
*
* @author Jaroslav Tulach
*/
final class RunTCK extends AbstractWizard {
private final URL html;
private final URL test;
private final String init;
private final CountDownLatch ready = new CountDownLatch(1);
private final TCK tck = new TCK();
private Throwable error;
static void test(String prefix, String init) throws Throwable {
new RunTCK(
RunTCK.class.getResource(prefix + ".html"),
RunTCK.class.getResource(prefix + ".js"),
init
).test();
}
private RunTCK(URL html, URL test, String init) throws Exception {
this.html = html;
this.test = test;
this.init = init;
component(0);
}
@Override
protected Object initSequence(ClassLoader l) throws Exception {
return init;
}
@Override
protected URL initPage(ClassLoader l) {
return html;
}
@Override
protected void initializationDone(Throwable t) {
error = t;
ready.countDown();
}
@Override
protected String[] getTechIds() {
return new String[0];
}
private void test() throws Throwable {
ready.await();
if (error != null) {
throw error;
}
executeScript(
"window.assertEquals = function(exp, real, msg) {\n"
+ " if (exp != real) {\n"
+ " throw msg + ' expected: ' + exp + ' real: ' + real;\n"
+ " }\n"
+ "};\n"
);
Object regFn = executeScript("(function(def) { window.tck = def; })");
evaluateCall(regFn, tck);
String str = readUrl();
executeScript(str);
}
private String readUrl() throws IOException {
InputStreamReader r = new InputStreamReader(test.openStream());
StringBuilder sb = new StringBuilder();
for (;;) {
int ch = r.read();
if (ch == -1) {
break;
}
sb.append((char)ch);
}
return sb.toString();
}
public final class TCK {
final RequestProcessor rp = new RequestProcessor("Validating");
private volatile RequestProcessor.Task lastTask;
TCK() {
}
public String[] steps(boolean localized) {
return RunTCK.this.steps(localized);
}
public String current() {
return RunTCK.this.currentStep();
}
public void next() throws InterruptedException {
final WizardDescriptor.AsynchronousValidatingPanel<?> avp = (WizardDescriptor.AsynchronousValidatingPanel<?>) RunTCK.this.current();
if (RunTCK.this.prepareValidation()) {
RequestProcessor.Task task = rp.post(new Runnable() {
@Override
public void run() {
try {
avp.validate();
RunTCK.this.nextPanel();
} catch (WizardValidationException ex) {
Exceptions.printStackTrace(ex);
} finally {
lastTask = null;
}
}
});
lastTask = task;
} else {
if (RunTCK.this.isValid()) {
RunTCK.this.nextPanel();
}
}
}
public void previous() {
RunTCK.this.previousPanel();
}
public Object data() {
return RunTCK.this.data();
}
private final List<Object> later = new ArrayList<>();
public void invokeLater(Object fn) {
later.add(fn);
}
public void invokeNow() {
RunTCK.this.invokeFn(later.toArray());
RequestProcessor.Task taskToWaitFor;
taskToWaitFor = lastTask;
if (taskToWaitFor != null) {
taskToWaitFor.waitFinished();
}
}
}
}