blob: 5d6e5d5e45490f8c7189ec92bb51cbdebe223c2f [file] [log] [blame]
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "AnimationModuleTests"
#include "AnimationModule.h"
#include "MathHelp.h"
#include <android/hardware/automotive/vehicle/2.0/IVehicle.h>
#include <gtest/gtest.h>
#include <map>
namespace android {
namespace hardware {
namespace automotive {
namespace sv {
namespace V1_0 {
namespace implementation {
namespace {
std::map<std::string, CarPart> getSampleCarPartsMap() {
std::vector<std::string> carFrameChildPartIds{"front_left_door", "front_right_door",
"front_left_blinker", "front_right_blinker",
"sun_roof"};
android_auto::surround_view::CarPart frame(std::vector<CarVertex>(),
android_auto::surround_view::CarMaterial(),
gMat4Identity, "root", carFrameChildPartIds);
android_auto::surround_view::CarPart frameChild(std::vector<CarVertex>(),
android_auto::surround_view::CarMaterial(),
gMat4Identity, "frame",
std::vector<std::string>());
std::map<std::string, CarPart> sampleCarParts;
sampleCarParts.emplace(std::make_pair("frame", frame));
sampleCarParts.emplace(std::make_pair("front_left_door", frameChild));
sampleCarParts.emplace(std::make_pair("front_right_door", frameChild));
sampleCarParts.emplace(std::make_pair("front_left_blinker", frameChild));
sampleCarParts.emplace(std::make_pair("front_right_blinker", frameChild));
sampleCarParts.emplace(std::make_pair("sun_roof", frameChild));
return sampleCarParts;
}
std::vector<AnimationInfo> getSampleAnimations() {
AnimationInfo frameAnimation = AnimationInfo{
.partId = "frame",
.parentId = "root",
.pose = gMat4Identity,
};
RotationOp frontLeftDoorRotationOp =
RotationOp{.vhalProperty = (int64_t)(0x0200 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 | VehicleArea::DOOR)
<< 32 |
(int64_t)(VehicleArea::DOOR),
.type = AnimationType::ROTATION_ANGLE,
.axis =
RotationAxis{
.axisVector = std::array<float, 3>{0.0f, 0.0f, 1.0f},
.rotationPoint = std::array<float, 3>{-1.0f, 0.5f, 0.0f},
},
.animationTime = 2000,
.rotationRange =
Range{
.start = 0.0f,
.end = 90.0f,
},
.vhalRange = Range{
.start = 0.0f,
.end = (float)INT32_MAX,
}};
std::map<uint64_t, std::vector<RotationOp>> frontLeftDoorRotationOpsMap;
frontLeftDoorRotationOpsMap.emplace(
std::make_pair(frontLeftDoorRotationOp.vhalProperty,
std::vector<RotationOp>{frontLeftDoorRotationOp}));
AnimationInfo frontLeftDoorAnimation = AnimationInfo{
.partId = "front_left_door",
.parentId = "frame",
.pose = gMat4Identity,
.rotationOpsMap = frontLeftDoorRotationOpsMap,
};
RotationOp frontRightDoorRotationOp =
RotationOp{.vhalProperty = (int64_t)(0x0201 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 | VehicleArea::DOOR)
<< 32 |
(int64_t)(VehicleArea::DOOR),
.type = AnimationType::ROTATION_ANGLE,
.axis =
RotationAxis{
.axisVector = std::array<float, 3>{0.0f, 0.0f, 1.0f},
.rotationPoint = std::array<float, 3>{1.0f, 0.5f, 0.0f},
},
.animationTime = 2000,
.rotationRange =
Range{
.start = 0.0f,
.end = -90.0f,
},
.vhalRange = Range{
.start = 0.0f,
.end = (float)INT32_MAX,
}};
std::map<uint64_t, std::vector<RotationOp>> frontRightDoorRotationOpsMap;
frontRightDoorRotationOpsMap.emplace(
std::make_pair(frontRightDoorRotationOp.vhalProperty,
std::vector<RotationOp>{frontRightDoorRotationOp}));
AnimationInfo frontRightDoorAnimation = AnimationInfo{
.partId = "front_right_door",
.parentId = "frame",
.pose = gMat4Identity,
.rotationOpsMap = frontRightDoorRotationOpsMap,
};
GammaOp frontLeftBlinkerGammaOp = GammaOp{
.vhalProperty = (int64_t)(0x0300 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 | VehicleArea::GLOBAL)
<< 32 |
(int64_t)(VehicleArea::GLOBAL),
.type = AnimationType::ADJUST_GAMMA_REPEAT,
.animationTime = 1000,
.gammaRange =
Range{
.start = 1.0f,
.end = 0.5f,
},
.vhalRange =
Range{
.start = 0.0f,
.end = (float)INT32_MAX,
},
};
std::map<uint64_t, std::vector<GammaOp>> frontLeftBlinkerGammaOpsMap;
frontLeftBlinkerGammaOpsMap.emplace(
std::make_pair(frontLeftBlinkerGammaOp.vhalProperty,
std::vector<GammaOp>{frontLeftBlinkerGammaOp}));
AnimationInfo frontLeftBlinkerAnimation = AnimationInfo{
.partId = "front_left_blinker",
.parentId = "frame",
.pose = gMat4Identity,
.gammaOpsMap = frontLeftBlinkerGammaOpsMap,
};
GammaOp frontRightBlinkerGammaOp = GammaOp{
.vhalProperty = (int64_t)(0x0301 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 | VehicleArea::GLOBAL)
<< 32 |
(int64_t)(VehicleArea::GLOBAL),
.type = AnimationType::ADJUST_GAMMA_REPEAT,
.animationTime = 1000,
.gammaRange =
Range{
.start = 1.0f,
.end = 0.5f,
},
.vhalRange =
Range{
.start = 0.0f,
.end = (float)INT32_MAX,
},
};
std::map<uint64_t, std::vector<GammaOp>> frontRightBlinkerGammaOpsMap;
frontRightBlinkerGammaOpsMap.emplace(
std::make_pair(frontRightBlinkerGammaOp.vhalProperty,
std::vector<GammaOp>{frontRightBlinkerGammaOp}));
AnimationInfo frontRightBlinkerAnimation = AnimationInfo{
.partId = "front_right_blinker",
.parentId = "frame",
.pose = gMat4Identity,
.gammaOpsMap = frontRightBlinkerGammaOpsMap,
};
TranslationOp sunRoofTranslationOp = TranslationOp{
.vhalProperty = (int64_t)(0x0400 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 | VehicleArea::GLOBAL)
<< 32 |
(int64_t)(VehicleArea::GLOBAL),
.type = AnimationType::TRANSLATION,
.direction = std::array<float, 3>{0.0f, -1.0f, 0.0f},
.animationTime = 3000,
.translationRange =
Range{
.start = 0.0f,
.end = 0.5f,
},
.vhalRange =
Range{
.start = 0.0f,
.end = (float)INT32_MAX,
},
};
std::map<uint64_t, std::vector<TranslationOp>> sunRoofRotationOpsMap;
sunRoofRotationOpsMap.emplace(std::make_pair(sunRoofTranslationOp.vhalProperty,
std::vector<TranslationOp>{sunRoofTranslationOp}));
AnimationInfo sunRoofAnimation = AnimationInfo{
.partId = "sun_roof",
.parentId = "frame",
.pose = gMat4Identity,
.translationOpsMap = sunRoofRotationOpsMap,
};
return std::vector<AnimationInfo>{frameAnimation,
frontLeftDoorAnimation,
frontRightDoorAnimation,
frontLeftBlinkerAnimation,
frontRightBlinkerAnimation,
sunRoofAnimation};
}
TEST(AnimationModuleTests, EmptyVhalSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
std::vector<AnimationParam> result =
animationModule.getUpdatedAnimationParams(std::vector<VehiclePropValue>());
EXPECT_EQ(result.size(), 0);
}
TEST(AnimationModuleTests, LeftDoorAnimationOnceSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::DOOR,
.prop = 0x0200 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::DOOR,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
TEST(AnimationModuleTests, LeftDoorAnimationTenTimesSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
for (int i = 0; i < 10; ++i) {
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::DOOR,
.prop = 0x0200 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::DOOR,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
}
TEST(AnimationModuleTests, RightDoorAnimationOnceSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::DOOR,
.prop = 0x0201 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::DOOR,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
TEST(AnimationModuleTests, RightDoorAnimationTenTimesSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
for (int i = 0; i < 10; ++i) {
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::DOOR,
.prop = 0x0201 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::DOOR,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
}
TEST(AnimationModuleTests, LeftBlinkerAnimationOnceSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0300 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
TEST(AnimationModuleTests, LeftBlinkerAnimationTenTimesSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
for (int i = 0; i < 10; ++i) {
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0300 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
}
TEST(AnimationModuleTests, RightBlinkerAnimationOnceSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0301 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
TEST(AnimationModuleTests, RightBlinkerAnimationTenTimesSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
for (int i = 0; i < 10; ++i) {
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0301 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
}
TEST(AnimationModuleTests, SunRoofAnimationOnceSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0400 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
TEST(AnimationModuleTests, SunRoofAnimationTenTimesSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
for (int i = 0; i < 10; ++i) {
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0400 | VehiclePropertyGroup::SYSTEM | VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values = std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 1);
}
}
TEST(AnimationModuleTests, All5PartsAnimationOnceSuccess) {
AnimationModule animationModule(getSampleCarPartsMap(), std::map<std::string, CarTexture>(),
getSampleAnimations());
std::vector<AnimationParam> result = animationModule.getUpdatedAnimationParams(
std::vector<VehiclePropValue>{VehiclePropValue{
.areaId = (int32_t)VehicleArea::DOOR,
.prop = 0x0200 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 |
VehicleArea::DOOR,
.value.int32Values =
std::vector<int32_t>(1, INT32_MAX),
},
VehiclePropValue{
.areaId = (int32_t)VehicleArea::DOOR,
.prop = 0x0201 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 |
VehicleArea::DOOR,
.value.int32Values =
std::vector<int32_t>(1, INT32_MAX),
},
VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0300 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values =
std::vector<int32_t>(1, INT32_MAX),
},
VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0301 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values =
std::vector<int32_t>(1, INT32_MAX),
},
VehiclePropValue{
.areaId = (int32_t)VehicleArea::GLOBAL,
.prop = 0x0400 | VehiclePropertyGroup::SYSTEM |
VehiclePropertyType::INT32 |
VehicleArea::GLOBAL,
.value.int32Values =
std::vector<int32_t>(1, INT32_MAX),
}});
EXPECT_EQ(result.size(), 5);
}
} // namespace
} // namespace implementation
} // namespace V1_0
} // namespace sv
} // namespace automotive
} // namespace hardware
} // namespace android