func TestEdisonAdaptorI2c(t *testing.T) {
	a, _ := initTestEdisonAdaptor()

	sysfs.SetSyscall(&sysfs.MockSyscall{})
	a.I2cStart(0xff)

	a.I2cWrite([]byte{0x00, 0x01})

	data, _ := a.I2cRead(2)
	gobot.Assert(t, data, []byte{0x00, 0x01})
}
func TestEdisonAdaptorI2c(t *testing.T) {
	a, _ := initTestEdisonAdaptor()

	sysfs.SetSyscall(&sysfs.MockSyscall{})
	a.I2cStart(0xff)

	a.i2cDevice = &NullReadWriteCloser{}
	a.I2cWrite(0xff, []byte{0x00, 0x01})

	data, _ := a.I2cRead(0xff, 2)
	gobot.Assert(t, data, []byte{0x00, 0x01})
}
func TestRaspiAdaptorI2c(t *testing.T) {
	a := initTestRaspiAdaptor()
	fs := sysfs.NewMockFilesystem([]string{
		"/dev/i2c-1",
	})
	sysfs.SetFilesystem(fs)
	sysfs.SetSyscall(&sysfs.MockSyscall{})
	a.I2cStart(0xff)

	a.I2cWrite([]byte{0x00, 0x01})
	data, _ := a.I2cRead(2)
	gobot.Assert(t, data, []byte{0x00, 0x01})
}
func TestEdisonAdaptorFinalize(t *testing.T) {
	a, _ := initTestEdisonAdaptor()
	a.DigitalWrite("3", 1)
	a.PwmWrite("5", 100)

	sysfs.SetSyscall(&sysfs.MockSyscall{})
	a.I2cStart(0xff)

	gobot.Assert(t, len(a.Finalize()), 0)

	closeErr = errors.New("close error")
	sysfs.SetFilesystem(sysfs.NewMockFilesystem([]string{}))
	gobot.Refute(t, len(a.Finalize()), 0)
}
func TestChipAdaptorI2c(t *testing.T) {
	a := initTestChipAdaptor()
	fs := sysfs.NewMockFilesystem([]string{
		"/dev/i2c-1",
	})
	sysfs.SetFilesystem(fs)
	sysfs.SetSyscall(&sysfs.MockSyscall{})
	a.I2cStart(0xff)
	a.i2cDevice = &NullReadWriteCloser{}

	a.I2cWrite(0xff, []byte{0x00, 0x01})
	data, _ := a.I2cRead(0xff, 2)
	gobot.Assert(t, data, []byte{0x00, 0x01})

	gobot.Assert(t, len(a.Finalize()), 0)
}
func TestRaspiAdaptorFinalize(t *testing.T) {
	a := initTestRaspiAdaptor()

	fs := sysfs.NewMockFilesystem([]string{
		"/sys/class/gpio/export",
		"/sys/class/gpio/unexport",
		"/dev/pi-blaster",
		"/dev/i2c-1",
		"/dev/i2c-0",
	})

	sysfs.SetFilesystem(fs)
	sysfs.SetSyscall(&sysfs.MockSyscall{})

	a.DigitalWrite("3", 1)
	a.PwmWrite("7", 255)

	a.I2cStart(0xff)
	gobot.Assert(t, len(a.Finalize()), 0)
}
func TestBeagleboneAdaptor(t *testing.T) {
	glob = func(pattern string) (matches []string, err error) {
		return make([]string, 2), nil
	}
	fs := sysfs.NewMockFilesystem([]string{
		"/dev/i2c-1",
		"/sys/devices/bone_capemgr.4",
		"/sys/devices/ocp.3",
		"/sys/devices/ocp.3/gpio-leds.8/leds/beaglebone:green:usr1/brightness",
		"/sys/devices/ocp.3/helper.5",
		"/sys/devices/ocp.3/helper.5/AIN1",
		"/sys/devices/ocp.3/pwm_test_P9_14.5",
		"/sys/devices/ocp.3/pwm_test_P9_14.5/run",
		"/sys/devices/ocp.3/pwm_test_P9_14.5/period",
		"/sys/devices/ocp.3/pwm_test_P9_14.5/polarity",
		"/sys/devices/ocp.3/pwm_test_P9_14.5/duty",
		"/sys/class/gpio/export",
		"/sys/class/gpio/unexport",
		"/sys/class/gpio/gpio60/value",
		"/sys/class/gpio/gpio60/direction",
		"/sys/class/gpio/gpio10/value",
		"/sys/class/gpio/gpio10/direction",
	})

	sysfs.SetFilesystem(fs)
	a := NewBeagleboneAdaptor("myAdaptor")
	a.slots = "/sys/devices/bone_capemgr.4"
	a.ocp = "/sys/devices/ocp.3"

	a.Connect()

	a.helper = "/sys/devices/ocp.3/helper.5"

	// PWM
	glob = func(pattern string) (matches []string, err error) {
		pattern = strings.TrimSuffix(pattern, "*")
		return []string{pattern + "5"}, nil
	}

	gobottest.Assert(t, a.PwmWrite("P9_99", 175), errors.New("Not a valid pin"))
	a.PwmWrite("P9_14", 175)
	gobottest.Assert(
		t,
		fs.Files["/sys/devices/ocp.3/pwm_test_P9_14.5/period"].Contents,
		"500000",
	)
	gobottest.Assert(
		t,
		fs.Files["/sys/devices/ocp.3/pwm_test_P9_14.5/duty"].Contents,
		"343137",
	)

	a.ServoWrite("P9_14", 100)
	gobottest.Assert(
		t,
		fs.Files["/sys/devices/ocp.3/pwm_test_P9_14.5/period"].Contents,
		"16666666",
	)
	gobottest.Assert(
		t,
		fs.Files["/sys/devices/ocp.3/pwm_test_P9_14.5/duty"].Contents,
		"1898148",
	)

	// Analog
	fs.Files["/sys/devices/ocp.3/helper.5/AIN1"].Contents = "567\n"
	i, _ := a.AnalogRead("P9_40")
	gobottest.Assert(t, i, 567)

	i, err := a.AnalogRead("P9_99")
	gobottest.Assert(t, err, errors.New("Not a valid pin"))

	// DigitalIO
	a.DigitalWrite("usr1", 1)
	gobottest.Assert(t,
		fs.Files["/sys/devices/ocp.3/gpio-leds.8/leds/beaglebone:green:usr1/brightness"].Contents,
		"1",
	)

	a.DigitalWrite("P9_12", 1)
	gobottest.Assert(t, fs.Files["/sys/class/gpio/gpio60/value"].Contents, "1")

	gobottest.Assert(t, a.DigitalWrite("P9_99", 1), errors.New("Not a valid pin"))

	fs.Files["/sys/class/gpio/gpio10/value"].Contents = "1"
	i, _ = a.DigitalRead("P8_31")
	gobottest.Assert(t, i, 1)

	// I2c
	sysfs.SetSyscall(&sysfs.MockSyscall{})
	a.I2cStart(0xff)

	a.i2cDevice = &NullReadWriteCloser{}

	a.I2cWrite(0xff, []byte{0x00, 0x01})
	data, _ := a.I2cRead(0xff, 2)
	gobottest.Assert(t, data, []byte{0x00, 0x01})

	gobottest.Assert(t, len(a.Finalize()), 0)
}