/******************************************************************************* * Copyright (c) 2012 eBay Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * eBay Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.vjet.eclipse.javatojs.core.tests.codegen.js; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.util.List; import java.util.Locale; import junit.framework.Assert; import org.eclipse.core.runtime.FileLocator; import org.eclipse.vjet.core.codegen.bootstrap.CodeGenInputEntity; import org.eclipse.vjet.core.codegen.bootstrap.CodeGenOutputEntity; import org.eclipse.vjet.core.codegen.bootstrap.CodeGenStatus; import org.eclipse.vjet.dsf.common.Z; import org.eclipse.vjet.dsf.jsgen.shared.generate.CodeStyle; import org.eclipse.vjet.dsf.jst.IJstType; import org.eclipse.vjet.dsf.jstojava.controller.NativeJsLibProvider; import org.eclipse.vjet.dsf.jstojava.parser.VjoParser; import org.eclipse.vjet.dsf.jstojava.translator.TranslateConfig; import org.eclipse.vjet.dsf.resource.permutation.Permutation; import org.eclipse.vjet.eclipse.core.ts.JstLibResolver; import org.eclipse.vjet.eclipse.javatojs.core.JsCodeGenTool; import org.eclipse.vjet.vsf.resource.pattern.js.IJsResourceDispenser; import org.eclipse.vjet.vsf.resource.pattern.js.IJsResourceRef; import org.eclipse.vjet.vsf.resource.pattern.js.JsRefCollection; import org.eclipse.vjet.vsf.resource.pattern.js.JsResource; import org.eclipse.vjet.vsf.resource.pattern.js.JsResourceRefMgr; import org.eclipse.vjet.vsf.resource.pattern.js.JsType; import org.junit.Ignore; import org.junit.Test; public class JsCodeGenToolTests /*extends TestCase*/ { @Test @Ignore public void testValidateLint() throws Exception { IJsResourceRef ref = JsDispenser.ref(JsResource.viaName("testlint")); CodeGenInputEntity input = new CodeGenInputEntity("TestLint"); input.setInputStream(new InputStreamReader( new ByteArrayInputStream(ref.getHandle(Permutation.create(Locale.US)).getScriptText().getBytes()))); JsCodeGenTool tool = new JsCodeGenTool(); List<CodeGenStatus> status =tool.validate(input); Assert.assertNotNull(status); Assert.assertFalse(status.isEmpty()); //for(CodeGenStatus stat : status){ // System.out.print(stat.getMessage()); // assertEquals(4,stat.getLineNumber()); //} } @Test @Ignore public void testValidateSyntax() throws Exception { IJsResourceRef ref = JsDispenser.ref(JsResource.viaName("testsyntax")); CodeGenInputEntity input = new CodeGenInputEntity("TestSyntax"); input.setInputStream(new InputStreamReader( new ByteArrayInputStream(ref.getHandle(Permutation.create(Locale.US)).getScriptText().getBytes()))); JsCodeGenTool tool = new JsCodeGenTool(); List<CodeGenStatus> status =tool.validate(input); Assert.assertNotNull(status); Assert.assertFalse(status.isEmpty()); //for(CodeGenStatus stat : status){ // System.out.println(stat.getMessage()); // assertEquals(2,stat.getLineNumber()); //} } @Test @Ignore public void testNoLintValidation() throws Exception { IJsResourceRef ref = JsDispenser.ref(JsResource.viaName("testdonotlint")); CodeGenInputEntity input = new CodeGenInputEntity("TestDoNotLint"); input.setInputStream(new InputStreamReader( new ByteArrayInputStream(ref.getHandle(Permutation.create(Locale.US)).getScriptText().getBytes()))); JsCodeGenTool tool = new JsCodeGenTool(); List<CodeGenStatus> status =tool.validate(input); Assert.assertNotNull(status); Assert.assertFalse(status.isEmpty()); //for(CodeGenStatus stat : status){ // assertSame("Not validating this file",stat.getMessage()); // assertEquals(0,stat.getLineNumber()); //} } @Test @Ignore public void testValidateAnnotations() throws Exception { IJsResourceRef ref = JsDispenser.ref(JsResource.viaName("testbadannotation")); CodeGenInputEntity input = new CodeGenInputEntity("TestAnnotations"); input.setInputStream(new InputStreamReader( new ByteArrayInputStream(ref.getHandle(Permutation.create(Locale.US)).getScriptText().getBytes()))); JsCodeGenTool tool = new JsCodeGenTool(); List<CodeGenStatus> status =tool.validate(input); Assert.assertNotNull(status); Assert.assertFalse(status.isEmpty()); //for(CodeGenStatus stat : status){ // System.out.println(stat.getMessage()); // assertEquals(7,stat.getLineNumber()); //} } /** * OutputStreamWriter that holds onto the reference for the * ByteArrayOutputStream it is writing to so that it can be accessed later. */ private static class ByteArrayOutputStreamWriter extends OutputStreamWriter { private ByteArrayOutputStream m_outputStream; public ByteArrayOutputStreamWriter(ByteArrayOutputStream out) { super(out); m_outputStream = out; } public ByteArrayOutputStream getOutputStream() { return m_outputStream; } } @Test public void testStaticJsrCodeGen() throws Exception { IJsResourceRef ref = JsDispenser.ref(JsResource.viaName("TestStatic")); URL inputURL = ref.getHandle(Permutation.create(Locale.US)).getExternalUrl(); System.out.println(inputURL); if(inputURL.getProtocol().contains("bundleresource")){ inputURL = FileLocator.toFileURL(inputURL); } CodeGenInputEntity input = new CodeGenInputEntity("TestStaticJsr.java"); input.setData(inputURL); // input.setData(ref.getHandle(Locale.getDefault()).getExternalUrl()); JsCodeGenTool tool = new JsCodeGenTool(); List<CodeGenOutputEntity> outputEntities = tool .getOutputEntities(input); // init output for (CodeGenOutputEntity outputEntity : outputEntities) { // Create the stream ByteArrayOutputStream outputStream = new ByteArrayOutputStream(4096); OutputStreamWriter outputStreamWriter = new ByteArrayOutputStreamWriter( outputStream); // Set the output stream on the entity outputEntity.setOutputStream(outputStreamWriter); } // for(CodeGenOutputEntity outputEntity:outputEntities){ // String inputStr = inputURL.toExternalForm(); // inputStr = inputStr.replace(File.separatorChar + "bin" + File.separatorChar , File.separatorChar + "src" + File.separatorChar); // URL outputURL = (URL)outputEntity.getData(); // File outputFile = new File(outputURL.getFile()); // OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream( // outputFile )); // // // Set the output stream on the entity // outputEntity.setOutputStream(outputStreamWriter); // } List<CodeGenStatus> status =tool.generate(input, outputEntities); JstLibResolver.getInstance() .setSdkEnvironment(new VJetSdkEnvironment(new String[0], "DefaultSdk")); new NativeJsLibProvider(); for(CodeGenOutputEntity output:outputEntities){ StringBuilder b = new StringBuilder(); b.append(Z.fmt("DATA", output.getData())); b.append(Z.fmt("NAME", output.getName())); b.append(Z.fmt("stream", output.getOutputStream())); TranslateConfig cfg = new TranslateConfig(); cfg.setSkiptImplementation(true); VjoParser p = new VjoParser(cfg); IJstType t = p.parse("ONDEMAND", inputURL); Assert.assertNotNull(t); JsCodeGenTool.genJsr(t, output.getOutputStream(), CodeStyle.PRETTY); output.getOutputStream().flush(); ByteArrayOutputStreamWriter writer = (ByteArrayOutputStreamWriter) output .getOutputStream(); ByteArrayOutputStream outputStream = writer.getOutputStream(); // ensure that JS native and browser bootstrap types // are currently found during on demand loading assertContains(outputStream.toString(), "HTMLElementJsr"); assertContains(outputStream.toString(), "ArrayJsr"); b.append(Z.fmt("TYPE", output.getType())); System.out.println(b.toString()); } Assert.assertNotNull(status); Assert.assertFalse(status.isEmpty()); } private void assertContains(String string, String string2) { Assert.assertTrue("could not find " + string2 + " inside " + string, string.indexOf(string2)!=-1); } public void TestStaticCodeGen() throws Exception { IJsResourceRef ref = JsDispenser.ref(JsResource.viaName("TestStaticCodeGen")); URL inputURL = ref.getHandle(Permutation.create(Locale.US)).getExternalUrl(); CodeGenInputEntity input = new CodeGenInputEntity("TestStaticCodeGenJsr.java"); input.setData(inputURL); // input.setData(ref.getHandle(Locale.getDefault()).getExternalUrl()); JsCodeGenTool tool = new JsCodeGenTool(); List<CodeGenOutputEntity> outputEntities = tool .getOutputEntities(input); // init output for (CodeGenOutputEntity outputEntity : outputEntities) { // Create the stream ByteArrayOutputStream outputStream = new ByteArrayOutputStream(4096); OutputStreamWriter outputStreamWriter = new ByteArrayOutputStreamWriter( outputStream); // Set the output stream on the entity outputEntity.setOutputStream(outputStreamWriter); } // for(CodeGenOutputEntity outputEntity:outputEntities){ // String inputStr = inputURL.toExternalForm(); // inputStr = inputStr.replace(File.separatorChar + "bin" + File.separatorChar , File.separatorChar + "src" + File.separatorChar); // URL outputURL = (URL)outputEntity.getData(); // File outputFile = new File(outputURL.getFile()); // OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream( // outputFile )); // // // Set the output stream on the entity // outputEntity.setOutputStream(outputStreamWriter); // } List<CodeGenStatus> status =tool.generate(input, outputEntities); for(CodeGenOutputEntity output:outputEntities){ StringBuilder b = new StringBuilder(); b.append(Z.fmt("DATA", output.getData())); b.append(Z.fmt("NAME", output.getName())); b.append(Z.fmt("stream", output.getOutputStream())); TranslateConfig cfg = new TranslateConfig(); cfg.setSkiptImplementation(true); VjoParser p = new VjoParser(cfg); IJstType t = p.parse("ONDEMAND", inputURL); Assert.assertNotNull(t); ByteArrayOutputStreamWriter writer = (ByteArrayOutputStreamWriter) output .getOutputStream(); // ByteArrayOutputStream outputStream = writer.getOutputStream(); b.append(Z.fmt("TYPE", output.getType())); System.out.println(b.toString()); } Assert.assertNotNull(status); Assert.assertFalse(status.isEmpty()); } public static class JsDispenser implements IJsResourceDispenser { public JsRefCollection getJsRefs() { return null; } public static IJsResourceRef ref(JsResource resource) { return JsRefMgrAdapter.createJsRef(resource, JsDispenser.class); } private static class JsRefMgrAdapter extends JsResourceRefMgr { protected static IJsResourceRef createJsRef (JsResource resource, Class<? extends IJsResourceDispenser> dispenser) { return JsResourceRefMgr.createJsRef(resource, dispenser, JsType.All); } } } //Disabled RHINO validation, since it's causing an infinite loop //http://quickbugstage.arch.ebay.com/show_bug.cgi?id=4113 // @Test // public void testLintVJOFalse() throws Exception { // // IJsResourceRef ref = JsDispenser.ref(JsResource.viaName("vjolint2")); // org.eclipse.vjet.dsf.bootstrap.codegen.CodeGenInputEntity input = new org.eclipse.vjet.dsf.bootstrap.codegen.CodeGenInputEntity("TestLint"); // // input.setInputStream(new InputStreamReader( // new ByteArrayInputStream(ref.getHandle(Permutation.create(Locale.US)).getScriptText().getBytes()))); // JsCodeGenTool tool = new JsCodeGenTool(); // List<CodeGenStatus> status =tool.validate(input); // Assert.assertNotNull(status); // // for(CodeGenStatus stat : status){ // System.out.print("status message + "+stat.getMessage()); // } // Assert.assertTrue(status.size()==1); // // } }