blob: cede4957f986ef04d9515967bff0a485d2a3f74b [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sgm37603a.h"
#include <fbl/vector.h>
#include <lib/mock-i2c/mock-i2c.h>
#include <zxtest/zxtest.h>
namespace backlight {
class MockGpio : public ddk::GpioProtocol<MockGpio> {
public:
MockGpio() : proto_{&gpio_protocol_ops_, this} {}
const gpio_protocol_t* proto() const { return &proto_; }
const fbl::Vector<uint8_t>& calls() const { return calls_; }
zx_status_t GpioConfigIn(uint32_t flags) { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GpioConfigOut(uint8_t initial) {
calls_.push_back(initial);
return ZX_OK;
}
zx_status_t GpioSetAltFunction(uint64_t function) { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GpioRead(uint8_t* out_value) { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GpioWrite(uint8_t value) { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GpioGetInterrupt(uint32_t flags, zx::interrupt* out_irq) {
return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t GpioReleaseInterrupt() { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GpioSetPolarity(gpio_polarity_t polarity) { return ZX_ERR_NOT_SUPPORTED; }
private:
gpio_protocol_t proto_;
fbl::Vector<uint8_t> calls_;
};
class MockSgm37603a : public Sgm37603a {
public:
MockSgm37603a(ddk::I2cChannel i2c)
: Sgm37603a(nullptr, std::move(i2c), ddk::GpioProtocolClient()) {}
zx_status_t EnableBacklight() override {
enable_called_ = true;
return ZX_OK;
}
zx_status_t DisableBacklight() override {
disable_called_ = true;
return ZX_OK;
}
void Reset() {
enable_called_ = false;
disable_called_ = false;
}
bool enable_called() const { return enable_called_; }
bool disable_called() const { return disable_called_; }
private:
bool enable_called_ = false;
bool disable_called_ = false;
};
TEST(BacklightTest, Enable) {
mock_i2c::MockI2c mock_i2c;
mock_i2c
.ExpectWriteStop({0x10, 0x03})
.ExpectWriteStop({0x11, 0x00})
.ExpectWriteStop({0x1a, 0x00})
.ExpectWriteStop({0x19, 0x00});
MockGpio mock_gpio;
Sgm37603a test(nullptr, ddk::I2cChannel(mock_i2c.GetProto()),
ddk::GpioProtocolClient(mock_gpio.proto()));
EXPECT_OK(test.EnableBacklight());
ASSERT_NO_FATAL_FAILURES(mock_i2c.VerifyAndClear());
ASSERT_EQ(1, mock_gpio.calls().size());
EXPECT_EQ(1, mock_gpio.calls()[0]);
}
TEST(BacklightTest, Disable) {
mock_i2c::MockI2c mock_i2c;
MockGpio mock_gpio;
Sgm37603a test(nullptr, ddk::I2cChannel(mock_i2c.GetProto()),
ddk::GpioProtocolClient(mock_gpio.proto()));
EXPECT_OK(test.DisableBacklight());
ASSERT_EQ(1, mock_gpio.calls().size());
EXPECT_EQ(0, mock_gpio.calls()[0]);
}
TEST(BacklightTest, Brightness) {
mock_i2c::MockI2c mock_i2c;
MockSgm37603a test(ddk::I2cChannel(mock_i2c.GetProto()));
EXPECT_OK(test.SetBacklightState(false, 127));
EXPECT_TRUE(test.disable_called());
test.Reset();
ASSERT_NO_FATAL_FAILURES(mock_i2c.VerifyAndClear());
bool power = true;
uint8_t brightness = 255;
EXPECT_OK(test.GetBacklightState(&power, &brightness));
EXPECT_FALSE(power);
EXPECT_EQ(0, brightness);
mock_i2c
.ExpectWriteStop({0x1a, 0})
.ExpectWriteStop({0x19, 127});
EXPECT_OK(test.SetBacklightState(true, 127));
EXPECT_TRUE(test.enable_called());
test.Reset();
ASSERT_NO_FATAL_FAILURES(mock_i2c.VerifyAndClear());
EXPECT_OK(test.GetBacklightState(&power, &brightness));
EXPECT_TRUE(power);
EXPECT_EQ(127, brightness);
mock_i2c
.ExpectWriteStop({0x1a, 0})
.ExpectWriteStop({0x19, 0});
EXPECT_OK(test.SetBacklightState(true, 0));
EXPECT_FALSE(test.enable_called());
test.Reset();
ASSERT_NO_FATAL_FAILURES(mock_i2c.VerifyAndClear());
EXPECT_OK(test.GetBacklightState(&power, &brightness));
EXPECT_TRUE(power);
EXPECT_EQ(0, brightness);
}
} // namespace backlight