func ExampleDecodeBuffer() bool {
	buf := bytes.NewBuffer(data)
	var m baseline.MessageHeader
	if err := m.Decode(buf, binary.LittleEndian, 0, true); err != nil {
		fmt.Println("Failed to decode message header", err)
		os.Exit(1)
	}

	// fmt.Println("\tbuffer is length:", buf.Len())
	var c baseline.Car
	if err := c.Decode(buf, binary.LittleEndian, m.Version, true); err != nil {
		fmt.Println("Failed to decode car", err)
		os.Exit(1)
	}
	return true
}
func ExampleDecodePipe() bool {
	var r, w = io.Pipe()

	go func() {
		defer w.Close()

		// By way of test, stream the bytes into the pipe 32 at a time
		msg := data[0:]
		for len(msg) > 0 {
			min := MinInt(len(msg), 64)
			// fmt.Println("writing: ", msg[0:min])
			n, err := w.Write(msg[0:min])
			if err != nil {
				fmt.Println("write error is", err)
				os.Exit(1)
			}
			if n < 8 {
				fmt.Println("short write of", n, "bytes")
				os.Exit(1)
			}
			msg = msg[n:]
			time.Sleep(time.Second)
		}
	}()

	var m baseline.MessageHeader
	m.Decode(r, binary.LittleEndian, 0, true)

	var c baseline.Car
	if err := c.Decode(r, binary.LittleEndian, m.Version, true); err != nil {
		fmt.Println("Failed to decode car", err)
		os.Exit(1)
	}
	r.Close()
	return true
}
func ExampleEncodeDecode() bool {
	in := makeCar()

	var buf = new(bytes.Buffer)
	if err := in.Encode(buf, binary.LittleEndian); err != nil {
		fmt.Println("Encoding Error", err)
		os.Exit(1)
	}

	var out baseline.Car = *new(baseline.Car)
	if err := out.Decode(buf, binary.LittleEndian, 0, true); err != nil {
		fmt.Println("Decoding Error", err)
		os.Exit(1)
	}

	if in.SerialNumber != out.SerialNumber {
		fmt.Println("in.SerialNumber != out.SerialNumber:\n", in.SerialNumber, out.SerialNumber)
		os.Exit(1)
	}
	if in.ModelYear != out.ModelYear {
		fmt.Println("in.ModelYear != out.ModelYear:\n", in.ModelYear, out.ModelYear)
		os.Exit(1)
	}
	if in.Available != out.Available {
		fmt.Println("in.Available != out.Available:\n", in.Available, out.Available)
		os.Exit(1)
	}
	if in.Code != out.Code {
		fmt.Println("in.Code != out.Code:\n", in.Code, out.Code)
		os.Exit(1)
	}
	if in.SomeNumbers != out.SomeNumbers {
		fmt.Println("in.SomeNumbers != out.SomeNumbers:\n", in.SomeNumbers, out.SomeNumbers)
		os.Exit(1)
	}
	if in.VehicleCode != out.VehicleCode {
		fmt.Println("in.VehicleCode != out.VehicleCode:\n", in.VehicleCode, out.VehicleCode)
		os.Exit(1)
	}
	if in.Extras != out.Extras {
		fmt.Println("in.Extras != out.Extras:\n", in.Extras, out.Extras)
		os.Exit(1)
	}

	// DiscountedModel is constant
	if baseline.Model.C != out.DiscountedModel {
		fmt.Println("in.DiscountedModel != out.DiscountedModel:\n", in.DiscountedModel, out.DiscountedModel)
		os.Exit(1)
	}

	// Engine has two constant values which should come back filled in
	if in.Engine == out.Engine {
		fmt.Println("in.Engine == out.Engine (and they should be different):\n", in.Engine, out.Engine)
		os.Exit(1)
	}

	// Engine has constant elements so We should have used our the
	// EngineInit() function to fill those in when we created the
	// object, and then they will correctly compare
	baseline.EngineInit(&in.Engine)
	if in.Engine != out.Engine {
		fmt.Println("in.Engine != out.Engine:\n", in.Engine, out.Engine)
		os.Exit(1)
	}

	return true
}
func ExampleDecodeSocket() bool {
	addr := "127.0.0.1:15678"
	writerDone := make(chan bool)
	readerDone := make(chan bool)

	// Reader
	go func() {
		// fmt.Println("resolve")
		tcpAddr, err := net.ResolveTCPAddr("tcp", addr)
		if err != nil {
			fmt.Println("Resolve failed", err.Error())
			os.Exit(1)
		}

		// fmt.Println("create listener")
		listener, err := net.ListenTCP("tcp", tcpAddr)
		if err != nil {
			fmt.Println("Listen failed", err.Error())
			os.Exit(1)
		}
		defer listener.Close()

		// fmt.Println("listen")
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Accept failed", err.Error())
			os.Exit(1)
		}
		defer conn.Close()

		// fmt.Println("reading messageheader")
		var m baseline.MessageHeader
		m.Decode(conn, binary.LittleEndian, 0, true)

		// fmt.Println("reading car")
		var c baseline.Car
		if err := c.Decode(conn, binary.LittleEndian, m.Version, true); err != nil {
			fmt.Println("Failed to decode car", err)
			os.Exit(1)
		}

		// fmt.Printf("%+v\n", c)
		readerDone <- true
	}()

	// Let that get started
	time.Sleep(time.Second)

	// Writer
	go func() {
		//fmt.Println("dial")
		conn, err := net.Dial("tcp", addr)
		if err != nil {
			fmt.Println("Dial failed", err.Error())
			os.Exit(1)
		}
		defer conn.Close()

		// By way of test, stream the bytes into the pipe 32 at a time
		msg := data[0:]
		for len(msg) > 0 {
			min := MinInt(len(msg), 64)
			// fmt.Println("writing: ", msg[0:min])
			n, err := conn.Write(msg[0:min])
			if err != nil {
				fmt.Println("write error is", err)
				os.Exit(1)
			}
			if n < 8 {
				fmt.Println("short write of", n, "bytes")
				os.Exit(1)
			}
			// fmt.Println("wrote", n, "bytes")
			msg = msg[n:]
			time.Sleep(time.Second)
		}
		<-readerDone
		writerDone <- true
	}()

	<-writerDone

	return true
}