#!/usr/bin/perl

use v5.14;
use warnings;

use Test::More;

use Device::BusPirate;
use lib "t/lib";
use TestBusPirate;

my $bp = Device::BusPirate->new(
   fh => [], # unused
);

# enter_mode
my $i2c;
{
   expect_write "\x00";
   expect_read "BBIO1";
   expect_write "\x02";
   expect_read "I2C1";

   $i2c = $bp->enter_mode( "I2C" )->get;
   ok( $i2c, '->enter_mode( "I2C" )' );

   check_and_clear '->enter_mode I2C';
}

# configure
{
   expect_write "\x62";
   expect_read "\x01";

   $i2c->configure( speed => "100k" )->get;

   check_and_clear '->configure';
}

# start_bit, stop_bit
{
   expect_write "\x02";
   expect_read "\x01";

   $i2c->start_bit->get;

   expect_write "\x03";
   expect_read "\x01";

   $i2c->stop_bit->get;

   check_and_clear '->start_bit and ->stop_bit';
}

# write
{
   expect_write "\x11\x12\x34";
   expect_read "\x01\x00\x00";

   $i2c->write( "\x12\x34" )->get;

   check_and_clear '->write';
}

# read
{
   expect_write "\x04";
   expect_read "\x56";
   expect_write "\x06";
   expect_read "\x01";
   expect_write "\x04";
   expect_read "\x78";
   expect_write "\x07";
   expect_read "\x01";

   is( $i2c->read( 2 )->get, "\x56\x78",
      '->read returns bytes' );

   check_and_clear '->read';
}

# send
{
   expect_write "\x02";
   expect_read "\x01";
   expect_write "\x12\x40\x12\x34";
   expect_read "\x01\x00\x00\x00";
   expect_write "\x03";
   expect_read "\x01";

   $i2c->send( 0x20, "\x12\x34" )->get;

   check_and_clear '->send';
}

# recv
{
   expect_write "\x02";
   expect_read "\x01";
   expect_write "\x10\x43";
   expect_read "\x01\x00";
   expect_write "\x04";
   expect_read "\x56";
   expect_write "\x06";
   expect_read "\x01";
   expect_write "\x04";
   expect_read "\x78";
   expect_write "\x07";
   expect_read "\x01";
   expect_write "\x03";
   expect_read "\x01";

   is( $i2c->recv( 0x21, 2 )->get, "\x56\x78",
      '->recv returns bytes' );

   check_and_clear '->recv';
}

# send_then_recv
{
   expect_write "\x02";
   expect_read "\x01";
   expect_write "\x12\x44\x89\xAB";
   expect_read "\x01\x00\x00\x00";
   expect_write "\x02";
   expect_read "\x01";
   expect_write "\x10\x45";
   expect_read "\x01\x00";
   expect_write "\x04";
   expect_read "\xCD";
   expect_write "\x07";
   expect_read "\x01";
   expect_write "\x03";
   expect_read "\x01";

   is( $i2c->send_then_recv( 0x22, "\x89\xAB", 1 )->get, "\xCD",
      '->send_then_recv returns bytes' );

   check_and_clear '->send_then_recv';
}

# aux
{
   expect_write "\x42";
   expect_read "\x01";

   $i2c->aux( 1 )->get;

   check_and_clear '->aux';
}

# power, pullups
{
   expect_write "\x4A";
   expect_read "\x01";

   $i2c->power( 1 )->get;

   expect_write "\x4E";
   expect_read "\x01";

   $i2c->pullup( 1 )->get;

   check_and_clear '->power and ->pullup';
}

done_testing;