code: /*******************************************************************************
   * Copyright (c) 2015 MITRE
   * All rights reserved. This program and the accompanying materials
   * are made available under the terms of the Apache License, Version 2.0 which
   * accompanies this distribution and is available at
   *    http://www.apache.org/licenses/LICENSE-2.0.txt
   ******************************************************************************/
  
  package org.locationtech.spatial4j.io;
  
  import com.carrotsearch.randomizedtesting.RandomizedTest;
  import org.locationtech.spatial4j.context.SpatialContext;
  import org.locationtech.spatial4j.shape.Shape;
  import org.junit.Test;
  
  public abstract class BaseRoundTripTest<T extends SpatialContext> extends RandomizedTest {
  
    protected T ctx;
    protected BinaryCodec binaryCodec;
  
    protected BaseRoundTripTest() {
      this.ctx = initContext();
      binaryCodec = ctx.getBinaryCodec();//stateless
    }
    
    public abstract T initContext();
    
    public boolean shouldBeEqualAfterRoundTrip() {
      return true;
    }
  
    //This test uses WKT to specify the shapes because the Jts based subclass tests will test
    // using floats instead of doubles, and WKT is normalized whereas ctx.makeXXX is not.
  
    @Test
    public void testPoint() throws Exception {
      assertRoundTrip(wkt("POINT(-10 80.3)"));
    }
  
    /** Convenience to read static data. */
    protected Shape wkt(String wkt) {
      try {
        return ctx.getFormats().getWktReader().read(wkt);
      } catch (RuntimeException e) {
        throw e;
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
  
    protected Shape randomShape() {
      switch (randomInt(2)) {//inclusive
        case 0: return wkt("POINT(-10 80.3)");
        case 1: return wkt("ENVELOPE(-10, 180, 42.3, 0)");
        case 2: return wkt("BUFFER(POINT(-10 30), 5.2)");
        default: throw new Error();
      }
    }
  
    protected final void assertRoundTrip(Shape shape) throws Exception {
      assertRoundTrip(shape, shouldBeEqualAfterRoundTrip()); 
    }
  
    protected abstract void assertRoundTrip(Shape shape, boolean andEquals) throws Exception;
  }
  