package com.github.filosganga.geogson.gson;

import com.github.filosganga.geogson.gson.utils.FeatureUtils;
import com.github.filosganga.geogson.model.Feature;
import com.github.filosganga.geogson.model.FeatureCollection;
import com.github.filosganga.geogson.model.Geometry;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import com.google.common.io.Resources;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.Collections;
import java.util.List;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;


public class FeatureCollectionAdapterTest {

    private Gson toTest;

    @Before
    public void initToTest() {
        toTest = new GsonBuilder().registerTypeAdapterFactory(new GeometryAdapterFactory()).create();
    }

    @Test
    public void shouldHandleEmptyFeatureCollection() {
        FeatureCollection collection = new FeatureCollection(Collections.<Feature>emptyList());
        FeatureCollection parsed = toTest.fromJson(toTest.toJson(collection), FeatureCollection.class);
        assertThat(parsed, equalTo(collection));
    }

    @Test
    public void shouldHandleFeatureCollectionWithFeatures() {
        List<Feature> features = ImmutableList.of(
                FeatureUtils.featureWithId("test1"),
                FeatureUtils.featureWithId("test2")
        );
        FeatureCollection collection = new FeatureCollection(features);
        FeatureCollection parsed = toTest.fromJson(toTest.toJson(collection), FeatureCollection.class);
        assertThat(parsed.features(), hasSize(2));
        assertThat(parsed.features().get(0).id().get(), equalTo("test1"));
        assertThat(parsed.features().get(1).id().get(), equalTo("test2"));
    }

    @Test
    public void shouldParseFeatureCollection() {

        String json = "{ \"type\": \"FeatureCollection\", \"features\": [ { \"type\": \"Feature\", \"geometry\": {\"type\": \"Point\", \"coordinates\": [102.0, 0.5]}, \"properties\": {\"prop0\": \"value0\"} }, { \"type\": \"Feature\", \"geometry\": { \"type\": \"LineString\", \"coordinates\": [ [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] ] }, \"properties\": { \"prop0\": \"value0\", \"prop1\": 0.0 } }, { \"type\": \"Feature\", \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] }, \"properties\": { \"prop0\": \"value0\", \"prop1\": {\"this\": \"that\"} } } ] }";

        FeatureCollection parsed = toTest.fromJson(json, FeatureCollection.class);

        assertThat(parsed.features(), hasSize(3));

    }

    @Test
    public void shouldParseRealFeatureCollection() throws IOException {

        String json = Resources.toString(Resources.getResource("feature-collection.json"), Charsets.UTF_8);

        FeatureCollection parsed = toTest.fromJson(json, FeatureCollection.class);

        assertThat(parsed.features(), hasSize(202));

    }


}

@@ -1064,24 +1064,161 @@
 ptyList());%0A
+        final String json = toTest.toJson(collection);%0A        assertThat(json, is(%22%7B%5C%22type%5C%22:%5C%22FeatureCollection%5C%22,%5C%22features%5C%22:%5B%5D%7D%22));%0A
         Feat
@@ -1260,33 +1260,12 @@
 son(
-toTest.toJson(collection)
+json
 , Fe

Add unit test for FeatureCollectionAdapter type