Merge "ref: Move unused libraries to deprecated."
diff --git a/lib/filelocker/locker.go b/lib/filelocker/locker.go
deleted file mode 100644
index 05b9af8..0000000
--- a/lib/filelocker/locker.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// package filelocker provides a primitive that lets a process
-// lock access to a file.
-package filelocker
-
-import (
-	"os"
-	"syscall"
-
-	"v.io/x/lib/vlog"
-)
-
-// Unlocker is the interface to unlock a locked file.
-type Unlocker interface {
-	// Unlock unlocks the file.
-	Unlock()
-}
-
-// Lock locks the provided file.
-//
-// If the file is already locked then the calling goroutine
-// blocks until the lock can be grabbed.
-//
-// The file must exist otherwise an error is returned.
-func Lock(filepath string) (Unlocker, error) {
-	file, err := os.Open(filepath)
-	if err != nil {
-		return nil, err
-	}
-	if err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX); err != nil {
-		return nil, err
-	}
-	return &unlocker{file}, nil
-}
-
-// TryLock tries to grab a lock on the provided file and
-// returns an error if it fails. This function is non-blocking.
-//
-// The file must exist otherwise an error is returned.
-func TryLock(filepath string) (Unlocker, error) {
-	file, err := os.Open(filepath)
-	if err != nil {
-		return nil, err
-	}
-	if err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
-		return nil, err
-	}
-	return &unlocker{file}, nil
-}
-
-// unlocker implements Unlocker.
-type unlocker struct {
-	file *os.File
-}
-
-func (u *unlocker) Unlock() {
-	if err := u.file.Close(); err != nil {
-		vlog.Errorf("failed to unlock file %q: %v", u.file.Name(), err)
-	}
-}
diff --git a/lib/filelocker/locker_test.go b/lib/filelocker/locker_test.go
deleted file mode 100644
index b0ea46e..0000000
--- a/lib/filelocker/locker_test.go
+++ /dev/null
@@ -1,160 +0,0 @@
-package filelocker
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"syscall"
-	"testing"
-	"time"
-
-	"v.io/x/ref/lib/modules"
-	"v.io/x/ref/lib/testutil/expect"
-)
-
-//go:generate v23 test generate
-
-func newFile() string {
-	file, err := ioutil.TempFile("", "test_lock_file")
-	if err != nil {
-		panic(err)
-	}
-	defer file.Close()
-	return file.Name()
-}
-
-func grabbedLock(lock <-chan bool) bool {
-	select {
-	case <-lock:
-		return true
-	case <-time.After(100 * time.Millisecond):
-		return false
-	}
-}
-
-func testLockChild(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
-	// Lock the file
-	unlocker, err := Lock(args[0])
-	if err != nil {
-		return fmt.Errorf("Lock failed: %v", err)
-	}
-	fmt.Fprintf(stdout, "locked\n")
-
-	// Wait for message from parent to unlock the file.
-	scanner := bufio.NewScanner(stdin)
-	if scanned := scanner.Scan(); !scanned || (scanned && scanner.Text() != "unlock") {
-		unlocker.Unlock()
-		return fmt.Errorf("unexpected message read from stdout, expected %v", "unlock")
-	}
-	unlocker.Unlock()
-	fmt.Fprintf(stdout, "unlocked\n")
-	return nil
-}
-
-func TestLockInterProcess(t *testing.T) {
-	filepath := newFile()
-	defer os.Remove(filepath)
-
-	sh, err := modules.NewShell(nil, nil)
-	if err != nil {
-		t.Fatalf("unexpected error: %s", err)
-	}
-	defer sh.Cleanup(os.Stderr, os.Stderr)
-	h, err := sh.Start("testLockChild", nil, filepath)
-	if err != nil {
-		t.Fatalf("sh.Start failed: %v", err)
-	}
-	s := expect.NewSession(t, h.Stdout(), time.Minute)
-
-	// Test that child grabbed the lock.
-	s.Expect("locked")
-
-	// Test that parent cannot grab the lock, and then send a message
-	// to the child to release the lock.
-	lock := make(chan bool)
-	go func() {
-		unlocker, err := Lock(filepath)
-		if err != nil {
-			t.Fatalf("Lock failed: %v", err)
-		}
-		close(lock)
-		unlocker.Unlock()
-	}()
-	if grabbedLock(lock) {
-		t.Fatal("Parent process unexpectedly grabbed lock before child released it")
-	}
-
-	// Test that the parent can grab the lock after the child has released it.
-	h.Stdin().Write([]byte("unlock\n"))
-	s.Expect("unlocked")
-	if !grabbedLock(lock) {
-		t.Fatal("Parent process failed to grab the lock after child released it")
-	}
-	s.ExpectEOF()
-}
-
-func TestLockIntraProcess(t *testing.T) {
-	filepath := newFile()
-	defer os.Remove(filepath)
-
-	// Grab the lock within this goroutine and test that
-	// another goroutine blocks when trying to grab the lock.
-	unlocker, err := Lock(filepath)
-	if err != nil {
-		t.Fatalf("Lock failed: %v", err)
-	}
-	lock := make(chan bool)
-	go func() {
-		unlocker, err := Lock(filepath)
-		if err != nil {
-			t.Fatalf("Lock failed: %v", err)
-		}
-		close(lock)
-		unlocker.Unlock()
-	}()
-	if grabbedLock(lock) {
-		unlocker.Unlock()
-		t.Fatal("Another goroutine unexpectedly grabbed lock before this goroutine released it")
-	}
-
-	// Release the lock and test that the goroutine can grab it.
-	unlocker.Unlock()
-	if !grabbedLock(lock) {
-		t.Fatal("Another goroutine failed to grab the lock after this goroutine released it")
-	}
-}
-
-func TestTryLock(t *testing.T) {
-	filepath := newFile()
-	defer os.Remove(filepath)
-
-	sh, err := modules.NewShell(nil, nil)
-	if err != nil {
-		t.Fatalf("unexpected error: %s", err)
-	}
-	defer sh.Cleanup(os.Stderr, os.Stderr)
-	h, err := sh.Start("testLockChild", nil, filepath)
-	if err != nil {
-		t.Fatalf("sh.Start failed: %v", err)
-	}
-	s := expect.NewSession(t, h.Stdout(), time.Minute)
-
-	// Test that child grabbed the lock.
-	s.Expect("locked")
-
-	// Test that parent cannot grab the lock, and then send a message
-	// to the child to release the lock.
-	if _, err := TryLock(filepath); err != syscall.EWOULDBLOCK {
-		t.Fatal("TryLock returned error: %v, want: %v", err, syscall.EWOULDBLOCK)
-	}
-
-	// Test that the parent can grab the lock after the child has released it.
-	h.Stdin().Write([]byte("unlock\n"))
-	s.Expect("unlocked")
-	if _, err = TryLock(filepath); err != nil {
-		t.Fatalf("TryLock failed: %v", err)
-	}
-	s.ExpectEOF()
-}
diff --git a/lib/filelocker/v23_internal_test.go b/lib/filelocker/v23_internal_test.go
deleted file mode 100644
index 65ed9a5..0000000
--- a/lib/filelocker/v23_internal_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file was auto-generated via go generate.
-// DO NOT UPDATE MANUALLY
-package filelocker
-
-import "fmt"
-import "testing"
-import "os"
-
-import "v.io/x/ref/lib/modules"
-import "v.io/x/ref/lib/testutil"
-
-func init() {
-	modules.RegisterChild("testLockChild", ``, testLockChild)
-}
-
-func TestMain(m *testing.M) {
-	testutil.Init()
-	if modules.IsModulesProcess() {
-		if err := modules.Dispatch(); err != nil {
-			fmt.Fprintf(os.Stderr, "modules.Dispatch failed: %v\n", err)
-			os.Exit(1)
-		}
-		return
-	}
-	os.Exit(m.Run())
-}
diff --git a/lib/unit/distance.go b/lib/unit/distance.go
deleted file mode 100644
index 19e6312..0000000
--- a/lib/unit/distance.go
+++ /dev/null
@@ -1,186 +0,0 @@
-package unit
-
-import (
-	"fmt"
-	"math"
-	"regexp"
-	"strconv"
-	"strings"
-)
-
-// metersInFoot denotes the number of meters in one foot, which is *exactly*
-// 0.3048 (i.e., there is no rounding).
-const (
-	metersInFoot = 0.3048
-	// MaxDistance represents the largest expressable distance.
-	MaxDistance Distance = math.MaxFloat64
-)
-
-// Distance represents a physical distance with floating-point precision.
-// It can be expressed in both metric and imperial units.
-//
-// Distance is internally stored in millimeter units.
-type Distance float64
-
-// Common distances.  To convert an integer number of units into a Distance,
-// multiply:
-//       fmt.Print(5*unit.Meter) // prints "5m0mm"
-//
-// To count a number of units in a Distance, divide:
-//       d := 5*unit.Meter
-//       fmt.Print(int64(d/unit.Centimeter)) // prints 500
-//
-// Distances can be added or subtracted:
-//       fmt.Print(5*unit.Meter + 3*unit.Centimeter) // prints "5m30mm"
-//       fmt.Print(3*unit.Kilometer - 2*unit.Kilometer) // prints "1km0m0mm"
-const (
-	Millimeter Distance = 1
-	Centimeter          = 10 * Millimeter
-	Meter               = 1000 * Millimeter
-	Kilometer           = 1000 * Meter
-	Foot                = metersInFoot * Meter
-	Inch                = Foot / 12
-	Yard                = 3 * Foot
-	Mile                = 1760 * Yard
-)
-
-var parseRegexp = regexp.MustCompile("^([0-9\\+\\-\\.eE]*)([mM][iI]|[kK][mM]|[mM][mM]|[cC][mM]|[fF][tT]|[iI][nN]|[fF][tT]|[yY][dD]|[mM])")
-
-// Parse parses the provided string and returns a new Distance.  The provided
-// string must be of the following format:
-//
-//         [+-]*(<positive_float_num>("mi"|"km"|"m"|"yd"|"ft"|"in"|"cm"|"mm"))+
-//
-// For example, the following are legitimate distance strings:
-//
-//         "10.2mi8km0.3m12yd100ft18in12.82cm22mm"
-//         "10km12m88cm"
-//         "12yd8ft3in"
-//         "-12yd3.2ft"
-//
-// ParseDistance will return an error if the string doesn't conform to the
-// above format.
-func ParseDistance(value string) (Distance, error) {
-	var total Distance
-	s := value
-
-	// See if the string starts with a +- sign and if so consume it.
-	neg := false
-	if len(s) > 0 && s[0] == '+' {
-		s = s[1:]
-	} else if len(s) > 0 && s[0] == '-' {
-		s = s[1:]
-		neg = true
-	}
-	match := parseRegexp.FindStringSubmatch(s)
-	if match == nil {
-		return 0, fmt.Errorf("invalid distance string: %q", value)
-	}
-	for match != nil && len(match) == 3 {
-		full, value, unit := match[0], match[1], match[2]
-		// Parse value.
-		f, err := strconv.ParseFloat(value, 64)
-		if err != nil {
-			return 0, fmt.Errorf("error parsing float in distance string %q: %s", value, err)
-		}
-		if f < 0 {
-			return 0, fmt.Errorf("can't use negative float unit count in distance string %q: %f", value, f)
-		}
-		// Parse unit.
-		var mult Distance
-		switch strings.ToLower(unit) {
-		case "mi":
-			mult = Mile
-		case "km":
-			mult = Kilometer
-		case "m":
-			mult = Meter
-		case "yd":
-			mult = Yard
-		case "ft":
-			mult = Foot
-		case "in":
-			mult = Inch
-		case "cm":
-			mult = Centimeter
-		case "mm":
-			mult = Millimeter
-		default: // should never happen
-			return 0, fmt.Errorf("illegal unit in distance string %q: %q", value, unit)
-		}
-		// Add the newly parsed sub-distance to the total.
-		total += Distance(f) * mult
-		// Advance to the next matched sub-distance.
-		s = s[len(full):]
-		match = parseRegexp.FindStringSubmatch(s)
-	}
-
-	if len(s) > 0 {
-		return 0, fmt.Errorf("invalid distance string: %q", value)
-	}
-
-	if neg {
-		total *= -1
-	}
-	return total, nil
-}
-
-func (d Distance) String() string {
-	var sign string
-	if d < 0 {
-		sign = "-"
-	}
-	v := math.Abs(float64(d))
-	kms := math.Floor(v / float64(Kilometer))
-	v = v - kms*float64(Kilometer)
-	ms := math.Floor(v / float64(Meter))
-	v = v - ms*float64(Meter)
-	mms := v
-	if kms > 0 {
-		return fmt.Sprintf("%s%gkm%gm%gmm", sign, kms, ms, mms)
-	}
-	if ms > 0 {
-		return fmt.Sprintf("%s%gm%gmm", sign, ms, mms)
-	}
-	return fmt.Sprintf("%s%gmm", sign, mms)
-}
-
-// Miles returns a distance value in mile units.
-func (d Distance) Miles() float64 {
-	return float64(d / Mile)
-}
-
-// Kilometers returns a distance value in kilometer units.
-func (d Distance) Kilometers() float64 {
-	return float64(d / Kilometer)
-}
-
-// Meters returns a distance value in meter units.
-func (d Distance) Meters() float64 {
-	return float64(d / Meter)
-}
-
-// Yards returns a distance value in yard units.
-func (d Distance) Yards() float64 {
-	return float64(d / Yard)
-}
-
-// Feet returns a distance value in foot units.
-func (d Distance) Feet() float64 {
-	return float64(d / Foot)
-}
-
-// Inches returns a distance value in inch units.
-func (d Distance) Inches() float64 {
-	return float64(d / Inch)
-}
-
-// Centimeters returns a distance value in centimeter units.
-func (d Distance) Centimeters() float64 {
-	return float64(d / Centimeter)
-}
-
-// Millimeters returns a distance value in millimeter units.
-func (d Distance) Millimeters() float64 {
-	return float64(d)
-}
diff --git a/lib/unit/distance_test.go b/lib/unit/distance_test.go
deleted file mode 100644
index d0521ea..0000000
--- a/lib/unit/distance_test.go
+++ /dev/null
@@ -1,259 +0,0 @@
-package unit
-
-import (
-	"math"
-	"testing"
-)
-
-func floatEq(first, second float64) bool {
-	const maxPrecisionError = 0.00000001
-	return math.Abs(float64(first)-float64(second)) <= maxPrecisionError
-}
-
-func TestDistanceAccessorsMetric(t *testing.T) {
-	d := 1 * Kilometer
-	if !floatEq(d.Kilometers(), 1) {
-		t.Errorf("kilometers error: have %v, want %v", d.Kilometers(), 1)
-	}
-	if !floatEq(d.Meters(), 1000) {
-		t.Errorf("meters error: have %v, want %v", d.Meters(), 1000)
-	}
-	if !floatEq(d.Centimeters(), 100000) {
-		t.Errorf("centimeters error: have %v, want %v", d.Centimeters(), 100000)
-	}
-	if !floatEq(d.Millimeters(), 1000000) {
-		t.Errorf("millimeters error: have %v, want %v", d.Millimeters(), 1000000)
-	}
-}
-
-func TestDistanceAccessorsImperial(t *testing.T) {
-	d := 1 * Mile
-	if !floatEq(d.Miles(), 1) {
-		t.Errorf("miles error: have %v, want %v", d.Miles(), 1)
-	}
-	if !floatEq(d.Yards(), 1760) {
-		t.Errorf("yards error: have %v, want %v", d.Yards(), float64(5280)/3)
-	}
-	if !floatEq(d.Feet(), 5280) {
-		t.Errorf("feet error: have %v, want %v", d.Feet(), 5280)
-	}
-	if !floatEq(d.Inches(), 63360) {
-		t.Errorf("inches error: have %v, want %v", d.Inches(), 63360)
-	}
-}
-
-func TestDistanceUnitConversions(t *testing.T) {
-	d := 100.9 * Meter
-	if !floatEq(d.Miles(), d.Feet()/5280) {
-		t.Error("wrong miles <-> feet conversion")
-	}
-	if !floatEq(d.Kilometers(), d.Meters()/1000) {
-		t.Error("wrong kilometers <-> meters conversion")
-	}
-	if !floatEq(d.Meters(), d.Centimeters()/100) {
-		t.Error("wrong meters <-> centimeters conversion")
-	}
-	if !floatEq(d.Feet(), d.Meters()/0.3048) {
-		t.Error("wrong feet <-> meters conversion")
-	}
-	if !floatEq(d.Feet(), d.Inches()/12) {
-		t.Error("wrong feet -> inches conversion.")
-	}
-	if !floatEq(d.Centimeters(), d.Millimeters()/10) {
-		t.Error("wrong centimeters -> millimeters conversion")
-	}
-}
-
-func TestDistanceParseAgainstConstants(t *testing.T) {
-	testcases := []struct {
-		string   string
-		expected Distance
-	}{
-		{"1mi", 1 * Mile},
-		{"1km", 1 * Kilometer},
-		{"1m", 1 * Meter},
-		{"1yd", 1 * Yard},
-		{"1ft", 1 * Foot},
-		{"1in", 1 * Inch},
-		{"1cm", 1 * Centimeter},
-		{"1mm", 1 * Millimeter},
-		{"0.1mi", 0.1 * Mile},
-		{"0.1km", 0.1 * Kilometer},
-		{"0.1m", 0.1 * Meter},
-		{"0.1yd", 0.1 * Yard},
-		{"0.1ft", 0.1 * Foot},
-		{"0.1in", 0.1 * Inch},
-		{"0.1cm", 0.1 * Centimeter},
-		{"0.1mm", 0.1 * Millimeter},
-		{"-18.2mi", -18.2 * Mile},
-		{"-18.2km", -18.2 * Kilometer},
-		{"-18.2m", -18.2 * Meter},
-		{"-18.2yd", -18.2 * Yard},
-		{"-18.2ft", -18.2 * Foot},
-		{"-18.2in", -18.2 * Inch},
-		{"-18.2cm", -18.2 * Centimeter},
-		{"-18.2mm", -18.2 * Millimeter},
-		{"10mi9m", 10*Mile + 9*Meter},
-		{"10km9m8cm", 10*Kilometer + 9*Meter + 8*Centimeter},
-		{"10m9m8m", 27 * Meter},
-		{"-1cm100cm20cm2m", -1 * (2*Meter + 121*Centimeter)},
-	}
-	for _, tc := range testcases {
-		d, err := ParseDistance(tc.string)
-		if err != nil {
-			t.Errorf("ParseDistance(%q) returned error: %v", tc.string, err)
-			continue
-		}
-		if !floatEq(d.Millimeters(), tc.expected.Millimeters()) {
-			t.Errorf("ParseDistance(%q).Millimeters() = %v; want %v", tc.string, d.Millimeters(), tc.expected.Millimeters())
-		}
-	}
-}
-
-func TestDistanceParseAgainstParse(t *testing.T) {
-	testcases := []struct {
-		first, second string
-	}{
-		// Singles.
-		{"1mi", "5280ft"},
-		{"1km", "1000m"},
-		{"1m", "100cm"},
-		{"1yd", "3ft"},
-		{"1ft", "12in"},
-		{"1in", "2.54cm"},
-		{"1cm", "10mm"},
-		{"-1cm", "-10mm"},
-		{"10mi", "52800ft"},
-		{"10km", "10000m"},
-		{"10m", "1000cm"},
-		{"10yd", "30ft"},
-		{"10ft", "120in"},
-		{"10in", "25.4cm"},
-		{"10cm", "100mm"},
-		{"-10cm", "-100mm"},
-		{"0.1mi", "528ft"},
-		{"0.1km", "100m"},
-		{"0.1m", "10cm"},
-		{"0.1yd", "0.3ft"},
-		{"0.1ft", "1.2in"},
-		{"0.1in", "0.254cm"},
-		{"0.1cm", "1mm"},
-		{"-0.1cm", "-1mm"},
-		// Pairs.
-		{"1mi1km", "1mi1000m"},
-		{"1mi1m", "1mi100cm"},
-		{"1mi1yd", "1mi3ft"},
-		{"1mi1ft", "5281ft"},
-		{"1mi1in", "5280ft1in"},
-		{"1mi1cm", "5280ft10mm"},
-		{"1mi1mm", "5280ft1mm"},
-		{"-1mi1mm", "-5280ft1mm"},
-		{"1km1m", "1001m"},
-		{"1km1yd", "1000m3ft"},
-		{"1km1ft", "1000m12in"},
-		{"1km1in", "1000m2.54cm"},
-		{"1km1cm", "1000m10mm"},
-		{"1km1mm", "1000m0.1cm"},
-		{"-1km1mm", "-1000m0.1cm"},
-		{"1m1yd", "3ft100cm"},
-		{"1m1ft", "12in100cm"},
-		{"1m1in", "102.54cm"},
-		{"1m1cm", "101cm"},
-		{"1m1mm", "1001mm"},
-		{"-1m1mm", "-1001mm"},
-		{"1yd1ft", "4ft"},
-		{"1yd1in", "3ft1in"},
-		{"1yd1cm", "3ft10mm"},
-		{"1yd1mm", "3ft0.1cm"},
-		{"-1yd1mm", "-3ft0.1cm"},
-		{"1ft1in", "13in"},
-		{"1ft1cm", "12in10mm"},
-		{"1ft1mm", "12in0.1cm"},
-		{"-1ft1mm", "-12in0.1cm"},
-		{"1in1cm", "1in10mm"},
-		{"1in1mm", "1in0.1cm"},
-		{"-1in1mm", "-1in0.1cm"},
-		{"1cm1mm", "11mm"},
-		// Complex.
-		{"1mi1km1m1yd1ft1in1cm1mm", "1001m5284ft1in11mm"},
-		{"-1mi1km1m1yd1ft1in1cm1mm", "-1001m5284ft1in11mm"},
-		// CAPS.
-		{"1Mi", "1mI"},
-		{"1mi", "1MI"},
-		{"1Km", "1kM"},
-		{"1km", "1KM"},
-		{"1M", "1m"},
-		{"1Yd", "1yD"},
-		{"1yd", "1YD"},
-		{"1Ft", "1fT"},
-		{"1ft", "1FT"},
-		{"1In", "1iN"},
-		{"1in", "1IN"},
-		{"1Cm", "1cM"},
-		{"1cm", "1CM"},
-		{"1Mm", "1mM"},
-		{"1mm", "1MM"},
-	}
-	for _, tc := range testcases {
-		first, err := ParseDistance(tc.first)
-		if err != nil {
-			t.Errorf("ParseDistance(%q) returned error: %v", tc.first, err)
-			continue
-		}
-		second, err := ParseDistance(tc.second)
-		if err != nil {
-			t.Errorf("ParseDistance(%q) returned error: err", tc.second, err)
-			continue
-		}
-		if !floatEq(first.Millimeters(), second.Millimeters()) {
-			t.Errorf("ParseDistance(%q).Millimeters() = %v; want %v = ParseDistance(%q).Millimeters()", tc.first, first.Millimeters(), second.Millimeters(), tc.second)
-		}
-	}
-}
-
-func TestDistanceString(t *testing.T) {
-	testcases := []struct {
-		d        Distance
-		expected string
-	}{
-		{1 * Kilometer, "1km0m0mm"},
-		{1 * Meter, "1m0mm"},
-		{1 * Millimeter, "1mm"},
-		{1200 * Meter, "1km200m0mm"},
-		{1.3 * Kilometer, "1km300m0mm"},
-		{-2.7 * Kilometer, "-2km700m0mm"},
-		{5.33 * Millimeter, "5.33mm"},
-		{3.0000000000001 * Millimeter, "3.0000000000001mm"},
-		{9*Kilometer + 12*Meter, "9km12m0mm"},
-		{9*Kilometer - 12*Meter, "8km988m0mm"},
-		{12*Meter - 9*Kilometer, "-8km988m0mm"},
-		{9*Kilometer + 2222*Meter + 1024.5*Millimeter, "11km223m24.5mm"},
-		{-1*Kilometer - 3200.3*Meter - 22*Millimeter, "-4km200m322mm"},
-	}
-	for _, tc := range testcases {
-		if tc.d.String() != tc.expected {
-			t.Errorf("Got string %q; want %q", tc.d, tc.expected)
-		}
-	}
-}
-
-func TestDistanceParseError(t *testing.T) {
-	testcases := []string{
-		"1kf",
-		"1fm",
-		"1kmm",
-		"m",
-		"cm",
-		"1ft 1mi",
-		" 1ft 1mi",
-		"1ft 1mi ",
-		"1ft   1mi",
-		"1mi-4km",
-		"-3km-4m",
-	}
-	for _, ds := range testcases {
-		if d, err := ParseDistance(ds); err == nil {
-			t.Errorf("ParseDistance(%q) = %q; want error", ds, d)
-		}
-	}
-}
diff --git a/lib/unit/doc.go b/lib/unit/doc.go
deleted file mode 100644
index df53801..0000000
--- a/lib/unit/doc.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// Package unit implements types for working with various measurement units.
-package unit