///|
fn main raise {
  let dataset : @shapefile.Dataset = {
    kind: @shapefile.Point,
    shapes: [
      {
        kind: @shapefile.Point,
        points: [@shapefile.coordinate(116.4, 39.9)],
        parts: [],
      },
    ],
    table: {
      fields: [{ name: "NAME", kind: @dbf.Character, width: 16, decimals: 0 }],
      rows: [{ deleted: false, values: [@dbf.Text("Beijing")] }],
    },
    prj: None,
  }
  let files = dataset.write_dataset()
  let restored = @shapefile.read_dataset(files.shp, files.shx, files.dbf)
  assert_eq(restored.shapes, dataset.shapes)
  assert_eq(restored.table, dataset.table)
  let selected = restored.filter_equal("NAME", @dbf.Text("Beijing"))
  assert_eq(selected.shapes.length(), 1)
  let json = selected.to_geojson()
  assert_eq(json, {
    "type": "FeatureCollection",
    "features": [
      {
        "type": "Feature",
        "geometry": { "type": "Point", "coordinates": [116.4, 39.9] },
        "properties": { "NAME": "Beijing" },
      },
    ],
  })
  println(json.stringify())
}