");
+ }
+}
diff --git a/confluence/src/test/java/org.jetbrains.jet.confluence/rendering/ConfluenceRenderingTest.java b/confluence/src/test/java/org.jetbrains.jet.confluence/rendering/ConfluenceRenderingTest.java
new file mode 100644
index 00000000000..b0ae2a407a7
--- /dev/null
+++ b/confluence/src/test/java/org.jetbrains.jet.confluence/rendering/ConfluenceRenderingTest.java
@@ -0,0 +1,71 @@
+package org.jetbrains.jet.confluence.rendering;
+
+import com.atlassian.renderer.v2.macro.MacroException;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.jetbrains.jet.confluence.TestUtils;
+import org.jetbrains.jet.lexer.JetMacro;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author Natalia.Ukhorskaya
+ */
+
+public class ConfluenceRenderingTest extends TestCase {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite();
+ TestSuite ats = new TestSuite();
+ suite.addTest(ats);
+ File parsingSourceDir = new File("./testData/rendering");
+ addFilesFromDirToSuite(parsingSourceDir, ats);
+ return suite;
+ }
+
+ private static void addFilesFromDirToSuite(File file, TestSuite ats) {
+ if (file.isDirectory()) {
+ for (File sourceFile : file.listFiles()) {
+ addFilesFromDirToSuite(sourceFile, ats);
+ }
+ } else {
+ if (file.getName().endsWith(".kt")) {
+ ats.addTest(new ConfluenceRenderingTest(file.getName(), file));
+ }
+ }
+ }
+
+ private final File sourceFile;
+
+ public ConfluenceRenderingTest(String name, File sourceFile) {
+ super(name);
+ this.sourceFile = sourceFile;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ checkSourceFile(sourceFile);
+ }
+
+ private void checkSourceFile(File sourceFile) throws IOException, MacroException {
+ String source = TestUtils.readFile(sourceFile);
+
+ StringBuilder actualResult = new StringBuilder();
+ new JetMacro().generateHtmlFromCode(source, actualResult);
+
+ File expectedResultFile = new File(sourceFile.getAbsolutePath().replace(".kt", ".txt"));
+ if (!expectedResultFile.exists()) {
+ expectedResultFile.createNewFile();
+ TestUtils.writeFile(expectedResultFile, TestUtils.divideResultForLines(actualResult.toString()));
+ assertTrue("File with expected result for " + expectedResultFile.getAbsolutePath() + " is absent.", false);
+ }
+
+ String expectedResult = TestUtils.readFile(expectedResultFile);
+
+
+ assertEquals(expectedResult,
+ TestUtils.divideResultForLines(actualResult.toString()));
+ }
+}
diff --git a/confluence/testData/rendering/elements/class.kt b/confluence/testData/rendering/elements/class.kt
new file mode 100644
index 00000000000..a082c511e08
--- /dev/null
+++ b/confluence/testData/rendering/elements/class.kt
@@ -0,0 +1,7 @@
+class Greeter1() {
+
+}
+
+class Greeter2(val name : String) {
+
+}
\ No newline at end of file
diff --git a/confluence/testData/rendering/elements/class.txt b/confluence/testData/rendering/elements/class.txt
new file mode 100644
index 00000000000..a579e219588
--- /dev/null
+++ b/confluence/testData/rendering/elements/class.txt
@@ -0,0 +1,8 @@
+
+
classGreeter1(){
+
+
}
+
+
classGreeter2(valname:String){
+
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/elements/variable.kt b/confluence/testData/rendering/elements/variable.kt
new file mode 100644
index 00000000000..7364e4d32c7
--- /dev/null
+++ b/confluence/testData/rendering/elements/variable.kt
@@ -0,0 +1,5 @@
+val a : Int = 1
+val b = 1
+val c : Int
+c = 1
+var a : String = "sss"
\ No newline at end of file
diff --git a/confluence/testData/rendering/elements/variable.txt b/confluence/testData/rendering/elements/variable.txt
new file mode 100644
index 00000000000..bdfa9adad8b
--- /dev/null
+++ b/confluence/testData/rendering/elements/variable.txt
@@ -0,0 +1,6 @@
+
+
vala:Int=1
+
valb=1
+
valc:Int
+
c=1
+
vara:String="sss"
\ No newline at end of file
diff --git a/confluence/testData/rendering/elements/when.kt b/confluence/testData/rendering/elements/when.kt
new file mode 100644
index 00000000000..6faddf20ae9
--- /dev/null
+++ b/confluence/testData/rendering/elements/when.kt
@@ -0,0 +1,7 @@
+val language = if (args.size == 0) "EN" else args[0]
+when (language) {
+ "EN" -> "Hello!"
+ "ES" -> "¡Hola!"
+ "RU" -> "Привет!"
+ else -> "Sorry, I can't greet you in $language yet"
+}
\ No newline at end of file
diff --git a/confluence/testData/rendering/elements/when.txt b/confluence/testData/rendering/elements/when.txt
new file mode 100644
index 00000000000..b316772466b
--- /dev/null
+++ b/confluence/testData/rendering/elements/when.txt
@@ -0,0 +1,8 @@
+
+
vallanguage=if(args.size==0)"EN"elseargs[0]
+
when(language){
+
"EN"->"Hello!"
+
"ES"->"¡Hola!"
+
"RU"->"Привет!"
+
else->"Sorry, I can't greet you in $language yet"
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/adress_book.kt b/confluence/testData/rendering/examples/adress_book.kt
new file mode 100644
index 00000000000..9cb0446a0e9
--- /dev/null
+++ b/confluence/testData/rendering/examples/adress_book.kt
@@ -0,0 +1,47 @@
+namespace addressbook
+
+class Contact(
+ val name : String,
+ val emails : List,
+ val addresses : List,
+ val phonenums : List
+)
+
+class EmailAddress(
+ val user : String,
+ val host : String
+)
+
+class PostalAddress(
+ val streetAddress : String,
+ val city : String,
+ val zip : String,
+ val state : USState?,
+ val country : Country
+) {
+ assert {(state == null) xor (country == Countries["US"]) }
+}
+
+class PhoneNumber(
+ val country : Country,
+ val areaCode : Int,
+ val number : Long
+)
+
+object Countries {
+ fun get(id : CountryID) : Country = countryTable[id]
+
+ private var table : Map? = null
+ private val countryTable : Map
+ get() {
+ if (table == null) {
+ table = HashMap()
+ for (line in TextFile("countries.txt").lines(stripWhiteSpace = true)) {
+ table[line] = Country(line)
+ }
+ }
+ return table
+ }
+}
+
+class Country(val name : String)
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/adress_book.txt b/confluence/testData/rendering/examples/adress_book.txt
new file mode 100644
index 00000000000..a650d815f59
--- /dev/null
+++ b/confluence/testData/rendering/examples/adress_book.txt
@@ -0,0 +1,48 @@
+
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_function.kt b/confluence/testData/rendering/examples/basic_syntax_define_a_function.kt
new file mode 100644
index 00000000000..3c0054a9da7
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_define_a_function.kt
@@ -0,0 +1,4 @@
+// Return type mandatory
+fun sum(a : Int, b : Int) : Int {
+ return a + b
+}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_function.txt b/confluence/testData/rendering/examples/basic_syntax_define_a_function.txt
new file mode 100644
index 00000000000..5f330cc898d
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_define_a_function.txt
@@ -0,0 +1,5 @@
+
+
// Return type mandatory
+
funsum(a:Int,b:Int):Int{
+
returna+b
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_variable.kt b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.kt
new file mode 100644
index 00000000000..84edfdb2aed
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.kt
@@ -0,0 +1,4 @@
+val a : Int = 1
+val b = 1 // Type is inferred
+val c : Int // Type required when no initializer provided
+c = 1 // definite assignment
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_variable.txt b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.txt
new file mode 100644
index 00000000000..51ee4531913
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.txt
@@ -0,0 +1,5 @@
+
+
vala:Int=1
+
valb=1// Type is inferred
+
valc:Int// Type required when no initializer provided
+
c=1// definite assignment
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/basic_syntax_null_checks.kt b/confluence/testData/rendering/examples/basic_syntax_null_checks.kt
new file mode 100644
index 00000000000..b33f0088667
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_null_checks.kt
@@ -0,0 +1,32 @@
+package multiplier
+
+// Return null if str does not hold a number
+fun parseInt(str : String) : Int? {
+ // ...
+}
+
+fun main(args : Array) {
+ if (args.size < 2) {
+ print("No number supplied");
+ }
+ val x = parseInt(args[0])
+ val y = parseInt(args[1])
+
+ // We cannot say 'x * y' now because they may hold nulls
+
+ if (x != null && y != null) {
+ print(x * y) // Now we can
+ }
+
+ // ...
+ if (x == null) {
+ print("Wrong number format in '${args[0]}'")
+ return
+ }
+ if (y == null) {
+ print("Wrong number format in '${args[1]}'")
+ return
+ }
+ print(x * y) // Now we know that x and y are not nulls
+}
+
diff --git a/confluence/testData/rendering/examples/basic_syntax_null_checks.txt b/confluence/testData/rendering/examples/basic_syntax_null_checks.txt
new file mode 100644
index 00000000000..d35c9839f0b
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_null_checks.txt
@@ -0,0 +1,32 @@
+
+
packagemultiplier
+
+
// Return null if str does not hold a number
+
funparseInt(str:String):Int?{
+
// ...
+
}
+
+
funmain(args:Array<String>){
+
if(args.size<2){
+
print("No number supplied");
+
}
+
valx=parseInt(args[0])
+
valy=parseInt(args[1])
+
+
// We cannot say 'x * y' now because they may hold nulls
+
+
if(x!=null&&y!=null){
+
print(x*y)// Now we can
+
}
+
+
// ...
+
if(x==null){
+
print("Wrong number format in '${args[0]}'")
+
return
+
}
+
if(y==null){
+
print("Wrong number format in '${args[1]}'")
+
return
+
}
+
print(x*y)// Now we know that x and y are not nulls
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.kt b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.kt
new file mode 100644
index 00000000000..68c5739a540
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.kt
@@ -0,0 +1,6 @@
+fun max(a : Int, b : Int) : Int {
+ if (a > b)
+ return a
+ else
+ return b
+}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.txt b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.txt
new file mode 100644
index 00000000000..648c9af2ce2
--- /dev/null
+++ b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.txt
@@ -0,0 +1,7 @@
+
+
funmax(a:Int,b:Int):Int{
+
if(a>b)
+
returna
+
else
+
returnb
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.kt b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.kt
new file mode 100644
index 00000000000..2d44afdbca6
--- /dev/null
+++ b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.kt
@@ -0,0 +1,9 @@
+fun main(args : Array) {
+ val language = if (args.size == 0) "EN" else args[0]
+ println(when (language) {
+ "EN" -> "Hello!"
+ "ES" -> "¡Hola!"
+ "RU" -> "Привет!"
+ else -> "Sorry, I can't greet you in $language yet"
+ })
+}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.txt b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.txt
new file mode 100644
index 00000000000..48b9d279c0a
--- /dev/null
+++ b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.txt
@@ -0,0 +1,10 @@
+
+
funmain(args:Array<String>){
+
vallanguage=if(args.size==0)"EN"elseargs[0]
+
println(when(language){
+
"EN"->"Hello!"
+
"ES"->"¡Hola!"
+
"RU"->"Привет!"
+
else->"Sorry, I can't greet you in $language yet"
+
})
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.kt b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.kt
new file mode 100644
index 00000000000..03499b9e807
--- /dev/null
+++ b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.kt
@@ -0,0 +1,9 @@
+class Greeter(val name : String) {
+ fun greet() {
+ println("Hello, ${name}");
+ }
+}
+
+fun main(args : Array) {
+ Greeter(args[0]).greet()
+}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.txt b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.txt
new file mode 100644
index 00000000000..d85c333e4cd
--- /dev/null
+++ b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.txt
@@ -0,0 +1,10 @@
+
+
classGreeter(valname:String){
+
fungreet(){
+
println("Hello, ${name}");
+
}
+
}
+
+
funmain(args:Array<String>){
+
Greeter(args[0]).greet()
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.kt b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.kt
new file mode 100644
index 00000000000..c1db6631119
--- /dev/null
+++ b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.kt
@@ -0,0 +1,7 @@
+fun main(args : Array) {
+ if (args.size == 0) {
+ println("Please provide a name as a command-line argument")
+ return
+ }
+ println("Hello, ${args[0]}!")
+}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.txt b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.txt
new file mode 100644
index 00000000000..272661aa570
--- /dev/null
+++ b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.txt
@@ -0,0 +1,8 @@
+
+
funmain(args:Array<String>){
+
if(args.size==0){
+
println("Please provide a name as a command-line argument")
+
return
+
}
+
println("Hello, ${args[0]}!")
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/html_builder.kt b/confluence/testData/rendering/examples/html_builder.kt
new file mode 100644
index 00000000000..00bee9aa529
--- /dev/null
+++ b/confluence/testData/rendering/examples/html_builder.kt
@@ -0,0 +1,31 @@
+import html.*
+
+fun result(args : Array) =
+ html {
+ head {
+ title {+"XML encoding with Kotlin"}
+ }
+ body {
+ h1 {+"XML encoding with Kotlin"}
+ p {+"this format can be used as an alternative markup to XML"}
+
+ // an element with attributes and text content
+ a(href = "http://jetbrains.com/kotlin") {+"Kotlin"}
+
+ // mixed content
+ p {
+ +"This is some"
+ b {+"mixed"}
+ +"text. For more see the"
+ a(href = "http://jetbrains.com/kotlin") {+"Kotlin"}
+ +"project"
+ }
+ p {+"some text"}
+
+ // content generated by
+ p {
+ for (arg in args)
+ +arg
+ }
+ }
+ }
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/html_builder.txt b/confluence/testData/rendering/examples/html_builder.txt
new file mode 100644
index 00000000000..a4e0257d8fd
--- /dev/null
+++ b/confluence/testData/rendering/examples/html_builder.txt
@@ -0,0 +1,32 @@
+
+
importhtml.*
+
+
funresult(args:Array<String>)=
+
html{
+
head{
+
title{+"XML encoding with Kotlin"}
+
}
+
body{
+
h1{+"XML encoding with Kotlin"}
+
p{+"this format can be used as an alternative markup to XML"}
+
+
// an element with attributes and text content
+
a(href="http://jetbrains.com/kotlin"){+"Kotlin"}
+
+
// mixed content
+
p{
+
+"This is some"
+
b{+"mixed"}
+
+"text. For more see the"
+
a(href="http://jetbrains.com/kotlin"){+"Kotlin"}
+
+"project"
+
}
+
p{+"some text"}
+
+
// content generated by
+
p{
+
for(arginargs)
+
+arg
+
}
+
}
+
}
\ No newline at end of file
diff --git a/confluence/testData/rendering/examples/html_builder_with_refs.kt b/confluence/testData/rendering/examples/html_builder_with_refs.kt
new file mode 100644
index 00000000000..70ce56a58d5
--- /dev/null
+++ b/confluence/testData/rendering/examples/html_builder_with_refs.kt
@@ -0,0 +1,114 @@
+import html.*
+
+fun result(args : Array) =
+ html {
+ head {
+ title {+"XML encoding with Kotlin"}
+ }
+ body {
+ h1 {+"XML encoding with Kotlin"}
+ p {+"this format can be used as an alternative markup to XML"}
+
+ // an element with attributes and text content
+ a(href = "http://jetbrains.com/kotlin") {+"Kotlin"}
+
+ // mixed content
+ p {
+ +"This is some"
+ b {+"mixed"}
+ +"text. For more see the"
+ a(href = "http://jetbrains.com/kotlin") {+"Kotlin"}
+ +"project"
+ }
+ p {+"some text"}
+
+ // content generated by
+ p {
+ for (arg in args)
+ +arg
+ }
+ }
+ }
+
+