Package com.tinkerpop.blueprints.util.io.gml

Source Code of com.tinkerpop.blueprints.util.io.gml.GMLWriterTest

package com.tinkerpop.blueprints.util.io.gml;

import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
import com.tinkerpop.blueprints.impls.tg.TinkerGraphFactory;

import junit.framework.Assert;
import junit.framework.TestCase;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Iterator;

public class GMLWriterTest extends TestCase {

    public void testNormal() throws Exception {
        TinkerGraph g = new TinkerGraph();
        GMLReader.inputGraph(g, GMLReaderTest.class.getResourceAsStream("example.gml"));

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        GMLWriter w = new GMLWriter(g);
        w.setNormalize(true);
        w.outputGraph(bos);

        String actual = bos.toString();
        String expected = streamToByteArray(GMLWriterTest.class.getResourceAsStream("writer.gml"));

        // ignore carriage return character...not really relevant to the test
        assertEquals(expected.replace("\r", ""), actual.replace("\r", ""));

    }

    public void testUseIds() throws Exception {
        TinkerGraph g = new TinkerGraph();
        GMLReader.inputGraph(g, GMLReaderTest.class.getResourceAsStream("example.gml"));

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        GMLWriter w = new GMLWriter(g);
        w.setNormalize(true);
        w.setUseId(true);
        w.outputGraph(bos);

        String actual = bos.toString();
        String expected = streamToByteArray(GMLWriterTest.class.getResourceAsStream("writer2.gml"));

        // ignore carriage return character...not really relevant to the test
        assertEquals(expected.replace("\r", ""), actual.replace("\r", ""));

    }

    public void testRoundTrip() throws Exception {
        TinkerGraph g1 = TinkerGraphFactory.createTinkerGraph();

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        GMLWriter w = new GMLWriter(g1);
        w.setUseId(true);
        w.outputGraph(bos);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

        Graph g2 = new TinkerGraph();
        GMLReader.inputGraph(g2, bis);

        assertEquals(getIterableCount(g1.getVertices()), getIterableCount(g2.getVertices()));
        assertEquals(getIterableCount(g1.getEdges()), getIterableCount(g2.getEdges()));

    }

    public void testRoundTripIgnoreBadProperties() throws Exception {
        TinkerGraph g1 = TinkerGraphFactory.createTinkerGraph();
        Vertex v = g1.getVertex(1);
        v.setProperty("bad_property", "underscore");
        v.setProperty("bad property", "space");
        v.setProperty("bad-property", "dash");
        v.setProperty("bad$property", "other stuff");
        v.setProperty("badproperty_", "but don't get too fancy");
        v.setProperty("_badproperty", "or it won't work");
        v.setProperty("55", "numbers alone are bad");
        v.setProperty("5badproperty", "must start with alpha");
        v.setProperty("badpropertyajflalfjsajfdfjdkfjsdiahfshfksajdhfkjdhfkjhaskdfhaksdhfsalkjdfhkjdhkahsdfkjasdhfkajfdhkajfhkadhfkjsdafhkajfdhasdkfhakfdhakjsdfhkadhfakjfhaksdjhfkajfhakhfaksfdhkahdfkahfkajsdhfkjahdfkahsdfkjahfkhakfsdjhakjksfhakfhaksdhfkadhfakhfdkasfdhiuerfaeafdkjhakfdhfdadfasdfsdafadf", "super long keys won't work");
        v.setProperty("good5property", "numbers are cool");
        v.setProperty("goodproperty5", "numbers are cool");
        v.setProperty("a", "one letter is ok");

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        GMLWriter w = new GMLWriter(g1);
        w.setStrict(true);
        w.setUseId(true);
        w.outputGraph(bos);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

        Graph g2 = new TinkerGraph();
        GMLReader.inputGraph(g2, bis);

        assertEquals(getIterableCount(g1.getVertices()), getIterableCount(g2.getVertices()));
        assertEquals(getIterableCount(g1.getEdges()), getIterableCount(g2.getEdges()));

        Vertex v1 = g2.getVertex(1);
        Assert.assertNull(v1.getProperty("bad_property"));
        Assert.assertNull(v1.getProperty("bad property"));
        Assert.assertNull(v1.getProperty("bad-property"));
        Assert.assertNull(v1.getProperty("bad$property"));
        Assert.assertNull(v1.getProperty("_badproperty"));
        Assert.assertNull(v1.getProperty("badproperty_"));
        Assert.assertNull(v1.getProperty("5badproperty"));
        Assert.assertNull(v1.getProperty("55"));
        Assert.assertNull(v1.getProperty("badpropertyajflalfjsajfdfjdkfjsdiahfshfksajdhfkjdhfkjhaskdfhaksdhfsalkjdfhkjdhkahsdfkjasdhfkajfdhkajfhkadhfkjsdafhkajfdhasdkfhakfdhakjsdfhkadhfakjfhaksdjhfkajfhakhfaksfdhkahdfkahfkajsdhfkjahdfkahsdfkjahfkhakfsdjhakjksfhakfhaksdhfkadhfakhfdkasfdhiuerfaeafdkjhakfdhfdadfasdfsdafadf"));
        Assert.assertEquals("numbers are cool", v1.getProperty("good5property"));
        Assert.assertEquals("numbers are cool", v1.getProperty("goodproperty5"));
        Assert.assertEquals("one letter is ok", v1.getProperty("a"));

    }

    private String streamToByteArray(final InputStream in) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        try {
            int nRead;
            byte[] data = new byte[1024];

            while ((nRead = in.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, nRead);
            }

            buffer.flush();
        } finally {
            buffer.close();
        }
        return buffer.toString("ISO-8859-1");
    }

    /**
     * This tests checks, if quotation marks (") are escaped correctly, before
     * they are written to the GML file.
     * @throws Exception if something fails
     */
    public void testWriteStringPropertyWithQuotationMarks() throws Exception {
      TinkerGraph g1 = TinkerGraphFactory.createTinkerGraph();
      Vertex v = g1.getVertex(1);
      v.setProperty("escape_property", "quotation \"quote\" quotation end");

      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      GMLWriter w = new GMLWriter(g1);
      w.setUseId(true);
      w.outputGraph(bos);

      String gmlOutput = bos.toString();
      Assert.assertNotNull(gmlOutput);
      String message = "escaped_property was not escaped properly";
      Assert.assertTrue(message, gmlOutput.contains("quotation \\\"quote\\\" quotation end"));
    }

    // Note: this is only a very lightweight test of writer/reader encoding.
    // It is known that there are characters which, when written by GMLWriter,
    // cause parse errors for GraphMLReader.
    // However, this happens uncommonly enough that is not yet known which characters those are.
    public void testEncoding() throws Exception {

        Graph g = new TinkerGraph();
        Vertex v = g.addVertex(1);
        v.setProperty("text", "\u00E9");

        GMLWriter w = new GMLWriter(g);

        File f = File.createTempFile("test", "txt");
        f.deleteOnExit();
        OutputStream out = new FileOutputStream(f);
        w.outputGraph(out);
        out.close();

        Graph g2 = new TinkerGraph();
        GMLReader r = new GMLReader(g2);

        InputStream in = new FileInputStream(f);
        r.inputGraph(in);
        in.close();

        Vertex v2 = g2.getVertex(1);
        assertEquals("\u00E9", v2.getProperty("text"));
    }


    public void testStreamStaysOpen() throws IOException {
        final Graph g = TinkerGraphFactory.createTinkerGraph();
        final PrintStream oldStream = System.out;
        final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
        System.setOut(new PrintStream(outContent));

        final GMLWriter writer = new GMLWriter(g);
        writer.outputGraph(System.out);
        System.out.println("working");
        System.setOut(oldStream);

        assertTrue(outContent.toString().endsWith("working" + System.getProperty("line.separator")));
    }

    private int getIterableCount(Iterable<?> elements) {
        int counter = 0;

        Iterator<?> iterator = elements.iterator();
        while (iterator.hasNext()) {
            iterator.next();
            counter++;
        }

        return counter;
    }
}
TOP

Related Classes of com.tinkerpop.blueprints.util.io.gml.GMLWriterTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.