Skip to content

Implementation of TreeWriter and TreeParser + UnitTests by Kraynov Maxim #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.getintent.interview</groupId>
<artifactId>javatest1</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
11 changes: 10 additions & 1 deletion src/main/java/com/getintent/interview/TreeNode.java
Original file line number Diff line number Diff line change
@@ -11,7 +11,16 @@ public TreeNode(int value) {
this.value = value;
}

public void addChild(TreeNode child) {
public int getValue() {
return value;
}

public List<TreeNode> getChildren() {
return children;
}

public TreeNode addChild(TreeNode child) {
children.add(child);
return this;
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/getintent/interview/TreeParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.getintent.interview;

import org.apache.commons.lang3.StringUtils;

/**
* Created by Kraynov M. on 11/12/13.
*/
public class TreeParser {
int lastLine = 1;

private static TreeNode parseLine(String line) {
return new TreeNode(Integer.parseInt(line));
}

public TreeNode parse(String s) {
String[] lines = s.split("\\r?\\n");
String firstLine = lines[0];
TreeNode root = parseLine(firstLine);
parse(root, 0, lines);
return root;
}

private void parse(TreeNode parent, int depth, String[] lines) {
for (; lastLine < lines.length; ) {
String nextLine = lines[lastLine];
int spaceNumber = StringUtils.countMatches(nextLine, " ");
if (spaceNumber < depth) {
break;
}
String value = nextLine.trim();
TreeNode node = parseLine(value);
lastLine++;
if (parent != null) {
parent.addChild(node);
}
parse(node, spaceNumber + 1, lines);
}
}
}
30 changes: 30 additions & 0 deletions src/main/java/com/getintent/interview/TreePrinter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.getintent.interview;

import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;

/**
* Created by Kraynov M. on 11/12/13.
*/
public class TreePrinter implements TreeWriter {

private static void write(TreeNode node, String spaceNumber, Writer w) throws IOException {
if (node == null) {
return;
}
w.append(spaceNumber + node.getValue() + "\n");
for (Iterator<TreeNode> iter = node.getChildren().iterator(); iter.hasNext(); ) {
write(iter.next(), spaceNumber + " ", w);
}
}

@Override
public void write(TreeNode node, Writer w) {
try {
write(node, "", w);
} catch (IOException e) {
System.out.println("Error was occurred while writing tree" + e.getMessage());
}
}
}
55 changes: 55 additions & 0 deletions src/test/java/TestTreeParserAndWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import com.getintent.interview.TreeNode;
import com.getintent.interview.TreeParser;
import com.getintent.interview.TreePrinter;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.io.StringWriter;
import java.util.Arrays;
import java.util.Collection;

/**
* Created by Kraynov M. on 11/12/13.
*/
@RunWith(value = Parameterized.class)
public class TestTreeParserAndWriter {
private static String tree1 = "6\n" +
" 7\n" +
" 3\n" +
" 4\n" +
" 10\n" +
" 13\n" +
" 16\n" +
" 21\n";
private static String tree2 = "6\n" +
" 7\n" +
" 8\n";
private static String tree3 = "6\n" +
" 7\n" +
" 8\n" +
" 9\n" +
" 10\n";
private String treeString;

public TestTreeParserAndWriter(String treeString) {
this.treeString = treeString;
}

@Parameterized.Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][]{{tree1}, {tree2}, {tree3}};
return Arrays.asList(data);
}

@Test
public void testParseAndWrite() {
TreeParser parser = new TreeParser();
TreeNode parsedTree = parser.parse(treeString);
TreePrinter printer = new TreePrinter();
StringWriter writer = new StringWriter();
printer.write(parsedTree, writer);
Assert.assertEquals("Parser or Writer is not correct!", treeString, writer.toString());
}
}
37 changes: 37 additions & 0 deletions src/test/java/TestTreePrinter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import com.getintent.interview.TreeNode;
import com.getintent.interview.TreePrinter;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.StringWriter;

/**
* Created by Kraynov M. on 11/12/13.
*/
public class TestTreePrinter {
private static String tree1 = "6\n" +
" 7\n" +
" 3\n" +
" 4\n" +
" 10\n" +
" 13\n" +
" 16\n" +
" 21\n";
private TreeNode treeNode1;

@Before
public void init() {
treeNode1 = new TreeNode(6).addChild(new TreeNode(7).addChild(new TreeNode(3).addChild(new TreeNode(4))))
.addChild(new TreeNode(10))
.addChild(new TreeNode(13).addChild(new TreeNode(16)).addChild(new TreeNode(21)));
}

@Test
public void testWrite() {
TreePrinter printer = new TreePrinter();
StringWriter writer = new StringWriter();
printer.write(treeNode1, writer);
Assert.assertEquals("Writer is not correct!", tree1, writer.toString());
}
}