First, tests of projection

  >>> from shapely.geometry import Point, LineString, MultiLineString
  
  >>> point = Point(1, 1)
  >>> line1 = LineString(([0, 0], [2, 0]))
  >>> line1.project(point)
  1.0
  >>> line1.project(point, normalized=True)
  0.5

  >>> line2 = LineString(([3, 0], [3, 6]))
  >>> line2.project(point)
  1.0
  >>> line2.project(point, normalized=True)
  0.16666666666666666

  >>> multiline = MultiLineString([list(line1.coords), list(line2.coords)]) 
  >>> multiline.project(point)
  1.0
  >>> multiline.project(point, normalized=True)
  0.125

  >>> point.buffer(1.0).project(point) # doctest: +ELLIPSIS
  Traceback (most recent call last):
  ...
  TypeError: Only linear types support this operation

Points that aren't on the line project to 0.

  >>> line1.project(Point(-10,-10))
  0.0

Now tests of interpolation

  >>> line1.interpolate(0.5).wkt
  'POINT (0.5000000000000000 0.0000000000000000)'
  >>> line1.interpolate(0.5, normalized=True).wkt
  'POINT (1.0000000000000000 0.0000000000000000)'

  >>> line2.interpolate(0.5).wkt
  'POINT (3.0000000000000000 0.5000000000000000)'
  >>> line2.interpolate(0.5, normalized=True).wkt
  'POINT (3.0000000000000000 3.0000000000000000)'

  >>> multiline.interpolate(0.5).wkt
  'POINT (0.5000000000000000 0.0000000000000000)'
  >>> multiline.interpolate(0.5, normalized=True).wkt
  'POINT (3.0000000000000000 2.0000000000000000)'

Distances greater than length of the line or less than zero yield the line's
ends.

  >>> line1.interpolate(-1000.0).wkt
  'POINT (0.0000000000000000 0.0000000000000000)'
  >>> line1.interpolate(1000.0).wkt
  'POINT (2.0000000000000000 0.0000000000000000)'

