11760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen/*
21760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * Copyright (C) 2016 The Android Open Source Project
31760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *
41760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * Licensed under the Apache License, Version 2.0 (the "License");
51760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * you may not use this file except in compliance with the License.
61760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * You may obtain a copy of the License at
71760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *
81760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *      http://www.apache.org/licenses/LICENSE-2.0
91760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *
101760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * Unless required by applicable law or agreed to in writing, software
111760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * distributed under the License is distributed on an "AS IS" BASIS,
121760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * See the License for the specific language governing permissions and
141760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * limitations under the License.
151760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen */
161760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
171760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include "ranged_converter.h"
181760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
191760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include <gmock/gmock.h>
201760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include <gtest/gtest.h>
211760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
221760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include "converter_interface_mock.h"
231760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
241760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::Return;
251760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::SetArgPointee;
261760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::Test;
271760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::_;
281760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
291760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohennamespace v4l2_camera_hal {
301760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
311760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenclass RangedConverterTest : public Test {
321760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen protected:
331760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  virtual void SetUp() {
341760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    converter_.reset(new ConverterInterfaceMock<int, int32_t>());
351760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    dut_.reset(
361760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen        new RangedConverter<int, int32_t>(converter_, min_, max_, step_));
371760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  }
381760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
391760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  virtual void ExpectConvert(int32_t converted, int32_t expected) {
401760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    int initial = 99;
411760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    EXPECT_CALL(*converter_, MetadataToV4L2(initial, _))
421760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen        .WillOnce(DoAll(SetArgPointee<1>(converted), Return(0)));
431760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
441760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    int32_t actual = expected + 1;  // Initialize to non-expected value.
451760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    ASSERT_EQ(dut_->MetadataToV4L2(initial, &actual), 0);
461760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    EXPECT_EQ(actual, expected);
471760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  }
481760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
491760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  std::shared_ptr<ConverterInterfaceMock<int, int32_t>> converter_;
501760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  std::unique_ptr<RangedConverter<int, int32_t>> dut_;
511760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
521760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  const int32_t min_ = -11;
531760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  const int32_t max_ = 10;
541760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  const int32_t step_ = 3;
551760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen};
561760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
571760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(RangedConverterTest, NormalConversion) {
581760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's in range and on step.
591760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvert(max_ - step_, max_ - step_);
601760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
611760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
621760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(RangedConverterTest, RoundingConversion) {
631760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's in range but off step.
641760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvert(max_ - step_ + 1, max_ - step_);
651760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
661760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
671760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(RangedConverterTest, ClampUpConversion) {
681760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's below range.
691760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvert(min_ - 1, min_);
701760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
711760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
721760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(RangedConverterTest, ClampDownConversion) {
731760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's above range (even after fitting to step).
741760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvert(max_ + step_, max_);
751760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
761760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
771760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(RangedConverterTest, ConversionError) {
781760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int initial = 99;
791760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int err = -99;
801760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  EXPECT_CALL(*converter_, MetadataToV4L2(initial, _)).WillOnce(Return(err));
811760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
821760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int32_t unused;
831760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  EXPECT_EQ(dut_->MetadataToV4L2(initial, &unused), err);
841760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
851760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
861760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}  // namespace v4l2_camera_hal
87