package no.priv.garshol.duke.utils;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;
import no.priv.garshol.duke.Link;
import no.priv.garshol.duke.LinkDatabase;
import no.priv.garshol.duke.LinkKind;
import no.priv.garshol.duke.LinkStatus;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import static no.priv.garshol.duke.utils.TestUtils.verifySame;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class LinkFileWriterTest {
private File file;
private FileWriter writer;
private LinkFileWriter out;
private LinkDatabase db;
@Rule
public TemporaryFolder tmpdir = new TemporaryFolder();
@Before
public void setup() throws IOException {
file = tmpdir.newFile("links.txt");
writer = new FileWriter(file);
out = new LinkFileWriter(writer);
}
@Test
public void testEmpty() throws IOException {
writer.close();
load();
assertEquals("shouldn't contain links", 0, db.getAllLinks().size());
}
@Test
public void testSingleLink() throws IOException {
out.write("1", "2", true, 0.95);
writer.close();
load();
assertEquals(1, db.getAllLinks().size());
Link link = db.getAllLinks().iterator().next();
verifySame(new Link("1", "2", LinkStatus.ASSERTED, LinkKind.SAME, 0.95),
link);
}
@Test
public void testThreeLink() throws IOException {
out.write("1", "2", true, 0.95);
out.write("1", "3", false, 0.2);
out.write("3", "4", true, 0.8);
writer.close();
load();
assertEquals(3, db.getAllLinks().size());
Collection<Link> links = db.getAllLinks();
Link link = find(links, "1", "2");
verifySame(new Link("1", "2", LinkStatus.ASSERTED, LinkKind.SAME, 0.95),
link);
link = find(links, "1", "3");
verifySame(new Link("1", "3", LinkStatus.ASSERTED, LinkKind.DIFFERENT, 0.2),
link);
link = find(links, "3", "4");
verifySame(new Link("3", "4", LinkStatus.ASSERTED, LinkKind.SAME, 0.8),
link);
}
private Link find(Collection<Link> links, String id1, String id2) {
for (Link link : links)
if (link.getID1().equals(id1) && link.getID2().equals(id2))
return link;
fail("Couldn't find link " + id1 + " " + id2);
return null;
}
private void load() throws IOException {
db = LinkDatabaseUtils.loadTestFile(file.getAbsolutePath());
}
}