bindings: cxx: tests: add tests for SET_CONFIG methods
authorKent Gibson <warthog618@gmail.com>
Sun, 1 Dec 2019 03:23:57 +0000 (11:23 +0800)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Tue, 10 Dec 2019 13:41:38 +0000 (14:41 +0100)
Extend test coverage over set_config, set_flags, set_direction_input, and
set_direction_output methods.

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
bindings/cxx/tests/tests-line.cpp

index 9a0b4885db6b19aeee99c761c52d42ec827ce6b3..53530932fc3da92ec766a9f033e0971c8ea55907 100644 (file)
@@ -324,6 +324,134 @@ TEST_CASE("Line values can be set and read", "[line]")
        }
 }
 
+TEST_CASE("Line can be reconfigured", "[line]")
+{
+       mockup::probe_guard mockup_chips({ 8 });
+       ::gpiod::chip chip(mockup::instance().chip_name(0));
+       ::gpiod::line_request config;
+
+       config.consumer = consumer.c_str();
+
+       SECTION("set config (single line, active-state)")
+       {
+               auto line = chip.get_line(3);
+               config.request_type = ::gpiod::line_request::DIRECTION_INPUT;
+               config.flags = 0;
+               line.request(config);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_INPUT);
+               REQUIRE(line.active_state() == ::gpiod::line::ACTIVE_HIGH);
+
+               line.set_config(::gpiod::line_request::DIRECTION_OUTPUT,
+                       ::gpiod::line_request::FLAG_ACTIVE_LOW,1);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE(line.active_state() == ::gpiod::line::ACTIVE_LOW);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 0);
+               line.set_value(0);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 1);
+
+               line.set_config(::gpiod::line_request::DIRECTION_OUTPUT, 0);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE(line.active_state() == ::gpiod::line::ACTIVE_HIGH);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 0);
+               line.set_value(1);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 1);
+       }
+
+       SECTION("set flags (single line, active-state)")
+       {
+               auto line = chip.get_line(3);
+               config.request_type = ::gpiod::line_request::DIRECTION_OUTPUT;
+               config.flags = 0;
+               line.request(config,1);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 1);
+
+               line.set_flags(::gpiod::line_request::FLAG_ACTIVE_LOW);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE(line.active_state() == ::gpiod::line::ACTIVE_LOW);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 0);
+
+               line.set_flags(0);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE(line.active_state() == ::gpiod::line::ACTIVE_HIGH);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 1);
+       }
+
+       SECTION("set flags (single line, drive)")
+       {
+               auto line = chip.get_line(3);
+               config.request_type = ::gpiod::line_request::DIRECTION_OUTPUT;
+               config.flags = 0;
+               line.request(config);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE_FALSE(line.is_open_drain());
+               REQUIRE_FALSE(line.is_open_source());
+
+               line.set_flags(::gpiod::line_request::FLAG_OPEN_DRAIN);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE(line.is_open_drain());
+               REQUIRE_FALSE(line.is_open_source());
+
+               line.set_flags(::gpiod::line_request::FLAG_OPEN_SOURCE);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE_FALSE(line.is_open_drain());
+               REQUIRE(line.is_open_source());
+
+               line.set_flags(0);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE_FALSE(line.is_open_drain());
+               REQUIRE_FALSE(line.is_open_source());
+       }
+
+       SECTION("set flags (single line, bias)")
+       {
+               auto line = chip.get_line(3);
+               config.request_type = ::gpiod::line_request::DIRECTION_OUTPUT;
+               config.flags = 0;
+               line.request(config);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE_FALSE(line.is_open_drain());
+               REQUIRE_FALSE(line.is_open_source());
+
+               line.set_flags(::gpiod::line_request::FLAG_OPEN_DRAIN);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE(line.is_open_drain());
+               REQUIRE_FALSE(line.is_open_source());
+
+               line.set_flags(::gpiod::line_request::FLAG_OPEN_SOURCE);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE_FALSE(line.is_open_drain());
+               REQUIRE(line.is_open_source());
+
+               line.set_flags(0);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE_FALSE(line.is_open_drain());
+               REQUIRE_FALSE(line.is_open_source());
+       }
+
+       SECTION("set direction input (single line)")
+       {
+               auto line = chip.get_line(3);
+               config.request_type = ::gpiod::line_request::DIRECTION_OUTPUT;
+               config.flags = 0;
+               line.request(config);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               line.set_direction_input();
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_INPUT);
+       }
+
+       SECTION("set direction output (single line)")
+       {
+               auto line = chip.get_line(3);
+               config.request_type = ::gpiod::line_request::DIRECTION_INPUT;
+               config.flags = 0;
+               line.request(config);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_INPUT);
+               line.set_direction_output(1);
+               REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
+               REQUIRE(mockup::instance().chip_get_value(0, 3) == 1);
+       }
+}
+
 TEST_CASE("Exported line can be released", "[line]")
 {
        mockup::probe_guard mockup_chips({ 8 });