Skip to content

Regression tests with Unity Test Framework #278

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
May 7, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Assets/AWSIM/AWSIM.asmdef
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"name": "AWSIM"
}
7 changes: 7 additions & 0 deletions Assets/AWSIM/AWSIM.asmdef.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Assets/RGLUnityPlugin/AWSIM.asmref
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"reference": "GUID:6adb9a5fec9cc8c478d3d8da6e48fe3b"
}
7 changes: 7 additions & 0 deletions Assets/RGLUnityPlugin/AWSIM.asmref.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Assets/Ros2ForUnity/AWSIM.asmref
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"reference": "GUID:6adb9a5fec9cc8c478d3d8da6e48fe3b"
}
7 changes: 7 additions & 0 deletions Assets/Ros2ForUnity/AWSIM.asmref.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified Assets/Ros2ForUnity/Plugins/ros2cs_core.dll
Binary file not shown.
8 changes: 8 additions & 0 deletions Assets/Tests.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Assets/Tests/EditMode.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

83 changes: 83 additions & 0 deletions Assets/Tests/EditMode/EgoEditTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using NUnit.Framework;
using AWSIM;

using autoware_auto_vehicle_msgs.msg;

namespace Ego
{
public class TurnSignalInput
{
[OneTimeSetUp]
public void OneTimeSetUp() {
// ROS 2 Unity handler is required to load ROS 2 message assemblies
var ros2UnityCore = new ROS2.ROS2UnityCore();
}

public static object[] ros2UnityHazardTestCases =
{
new object[] { autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.DISABLE, Vehicle.TurnSignal.NONE },
new object[] { autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.ENABLE_LEFT, Vehicle.TurnSignal.LEFT },
new object[] { autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.ENABLE_RIGHT, Vehicle.TurnSignal.RIGHT },
new object[] { autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.NO_COMMAND, Vehicle.TurnSignal.NONE },
};
[TestCaseSource(nameof(ros2UnityHazardTestCases))]
public void Ros2Unity(byte light, Vehicle.TurnSignal result)
{
var command = new TurnIndicatorsCommand() {Command = light};
Assert.AreEqual(result, VehicleROS2Utility.RosToUnityTurnSignal(command));
}

public static object[] ros2UnityTurnSignalTestCases =
{
new object[] { Vehicle.TurnSignal.NONE, autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.DISABLE},
new object[] { Vehicle.TurnSignal.LEFT, autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.ENABLE_LEFT},
new object[] { Vehicle.TurnSignal.RIGHT, autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.ENABLE_RIGHT},
new object[] { Vehicle.TurnSignal.NONE, autoware_auto_vehicle_msgs.msg.TurnIndicatorsCommand.DISABLE},
};
[TestCaseSource(nameof(ros2UnityTurnSignalTestCases))]
public void Unity2Ros(Vehicle.TurnSignal signal, byte result)
{
Assert.AreEqual(VehicleROS2Utility.UnityToRosTurnSignal(signal), result);
}
}

public class GearsInput
{
[OneTimeSetUp]
public void OneTimeSetUp() {
// ROS 2 Unity handler is required to load ROS 2 message assemblies
var ros2UnityCore = new ROS2.ROS2UnityCore();
ros2UnityCore.DestroyNow();
}

public static object[] ros2UnityGearTestCases =
{
new object[] { autoware_auto_vehicle_msgs.msg.GearReport.NONE, Vehicle.Shift.PARKING },
new object[] { autoware_auto_vehicle_msgs.msg.GearReport.PARK, Vehicle.Shift.PARKING },
new object[] { autoware_auto_vehicle_msgs.msg.GearReport.NEUTRAL, Vehicle.Shift.NEUTRAL },
new object[] { autoware_auto_vehicle_msgs.msg.GearReport.REVERSE, Vehicle.Shift.REVERSE },
new object[] { autoware_auto_vehicle_msgs.msg.GearReport.DRIVE, Vehicle.Shift.DRIVE },
new object[] { autoware_auto_vehicle_msgs.msg.GearReport.LOW, Vehicle.Shift.DRIVE },
};
[TestCaseSource(nameof(ros2UnityGearTestCases))]
public void Ros2Unity(byte gear, Vehicle.Shift result)
{
var command = new GearCommand() {Command = gear};
Assert.AreEqual(result, VehicleROS2Utility.RosToUnityShift(command));
}

public static object[] unityToRosGearTestCases =
{
new object[] { Vehicle.Shift.PARKING, autoware_auto_vehicle_msgs.msg.GearReport.PARK },
new object[] { Vehicle.Shift.NEUTRAL, autoware_auto_vehicle_msgs.msg.GearReport.NEUTRAL },
new object[] { Vehicle.Shift.REVERSE, autoware_auto_vehicle_msgs.msg.GearReport.REVERSE },
new object[] { Vehicle.Shift.DRIVE, autoware_auto_vehicle_msgs.msg.GearReport.DRIVE },
};
[TestCaseSource(nameof(unityToRosGearTestCases))]
public void Unity2Ros(Vehicle.Shift gear, byte result)
{
Assert.AreEqual(VehicleROS2Utility.UnityToRosShift(gear), result);
}
}

}
11 changes: 11 additions & 0 deletions Assets/Tests/EditMode/EgoEditTests.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

155 changes: 155 additions & 0 deletions Assets/Tests/EditMode/SensorsEditTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
using NUnit.Framework;
using UnityEngine;
using AWSIM;
using UnityEngine.TestTools.Utils;

namespace Sensors
{
public class IMU
{
// Comparers
FloatEqualityComparer floatComparer;
Vector3EqualityComparer v3Comparer;

[OneTimeSetUp]
public void OneTimeSetUp() {
floatComparer = new FloatEqualityComparer(10e-6f);
v3Comparer = new Vector3EqualityComparer(10e-6f);
}

[Test]
public void Gravity()
{
bool dataReceived = false;
GameObject go = new GameObject();
var sensor = go.AddComponent<ImuSensor>();
sensor.EnableGravity = true;

sensor.OnOutputData += (ImuSensor.OutputData data) => {
dataReceived = true;
Assert.That(data.LinearAcceleration.y, Is.EqualTo(Physics.gravity.y).Using(floatComparer));
};

sensor.call("Start");
sensor.SetPrivateFieldValue<float>("timer", 1.0f);
sensor.call("FixedUpdate");

Assert.IsTrue(dataReceived);
UnityEngine.Object.DestroyImmediate(go);
}

[Test]
public void NoGravity()
{
bool dataReceived = false;
GameObject go = new GameObject();
var sensor = go.AddComponent<ImuSensor>();
sensor.EnableGravity = false;

sensor.OnOutputData += (ImuSensor.OutputData data) => {
dataReceived = true;
Assert.That(data.LinearAcceleration, Is.EqualTo(Vector3.zero).Using(v3Comparer));
};

sensor.call("Start");
sensor.SetPrivateFieldValue<float>("timer", 1.0f);
sensor.call("FixedUpdate");

Assert.IsTrue(dataReceived);
UnityEngine.Object.DestroyImmediate(go);
}
}

public class GNSS
{
FloatEqualityComparer floatComparer;
Vector3EqualityComparer v3Comparer;

[OneTimeSetUp]
public void OneTimeSetUp() {
floatComparer = new FloatEqualityComparer(10e-6f);
v3Comparer = new Vector3EqualityComparer(10e-6f);
}

[Test]
public void MgrsZero()
{
bool dataReceived = false;
GameObject go = new GameObject();
var sensor = go.AddComponent<GnssSensor>();
sensor.OutputHz = 1;
go.AddComponent<Environment>();

sensor.OnOutputData += (GnssSensor.OutputData data) => {
dataReceived = true;
Assert.That(data.MgrsPosition, Is.EqualTo(Vector3.zero).Using(v3Comparer));
};

sensor.call("Start");
sensor.SetPrivateFieldValue<float>("timer", 1.0f);
sensor.call("FixedUpdate");

Assert.IsTrue(dataReceived);
UnityEngine.Object.DestroyImmediate(go);
}

static Vector3[] gnssMgrsNonZeroValues = new Vector3[] {
Vector3.one,
new Vector3(-1.0f, 2.0f, 0.0f),
Vector3.up
};

[Test]
public void MgrsNonZero([ValueSource("gnssMgrsNonZeroValues")] Vector3 value)
{
bool dataReceived = false;
GameObject go = new GameObject();
var sensor = go.AddComponent<GnssSensor>();
var env = go.AddComponent<Environment>();
env.SetPrivateFieldValue<Vector3>("mgrsOffsetPosition", value);

sensor.OnOutputData += (GnssSensor.OutputData data) => {
dataReceived = true;
Assert.That(data.MgrsPosition, Is.EqualTo(value).Using(v3Comparer));
};

sensor.call("Start");
sensor.SetPrivateFieldValue<float>("timer", 1.0f);
sensor.call("FixedUpdate");

Assert.IsTrue(dataReceived);
UnityEngine.Object.DestroyImmediate(go);
}

public static object[] gnssTranslateCases =
{
new object[] { new Vector3(1.0f, 0.0f, 1.0f), new Vector3(1.0f, -1.0f, 0.0f) },
new object[] { new Vector3(-1.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f) },
new object[] { new Vector3(-1.0f, -1.0f, -1.0f), new Vector3(-1.0f, 1.0f, -1.0f) },
};
[TestCaseSource(nameof(gnssTranslateCases))]
public void Translate(Vector3 translate, Vector3 expectedResult)
{
bool dataReceived = false;
GameObject go = new GameObject();
var sensor = go.AddComponent<GnssSensor>();
sensor.OutputHz = 1;
var env = go.AddComponent<Environment>();

go.transform.Translate(translate);

sensor.OnOutputData += (GnssSensor.OutputData data) => {
dataReceived = true;
Assert.That(data.MgrsPosition, Is.EqualTo(expectedResult).Using(v3Comparer));
};

sensor.call("Start");
sensor.SetPrivateFieldValue<float>("timer", 1.0f);
sensor.call("FixedUpdate");

Assert.IsTrue(dataReceived);
UnityEngine.Object.DestroyImmediate(go);
}
}
}

11 changes: 11 additions & 0 deletions Assets/Tests/EditMode/SensorsEditTests.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

39 changes: 39 additions & 0 deletions Assets/Tests/EditMode/Tests.asmdef
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"name": "Tests",
"rootNamespace": "",
"references": [
"UnityEngine.TestRunner",
"UnityEditor.TestRunner",
"AWSIM",
"AccessExtensions"
],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": true,
"overrideReferences": true,
"precompiledReferences": [
"nunit.framework.dll",
"autoware_auto_vehicle_msgs_assembly.dll",
"autoware_auto_planning_msgs_assembly.dll",
"autoware_auto_geometry_msgs_assembly.dll",
"autoware_auto_mapping_msgs_assembly.dll",
"geometry_msgs_assembly.dll",
"nav_msgs_assembly.dll",
"std_msgs_assembly.dll",
"builtin_interfaces_assembly.dll",
"action_msgs_assembly.dll",
"autoware_auto_control_msgs_assembly.dll",
"autoware_auto_perception_msgs_assembly.dll",
"autoware_common_msgs_assembly.dll",
"autoware_perception_msgs_assembly.dll",
"sensor_msgs_assembly.dll"
],
"autoReferenced": true,
"defineConstraints": [
"UNITY_INCLUDE_TESTS"
],
"versionDefines": [],
"noEngineReferences": false
}
7 changes: 7 additions & 0 deletions Assets/Tests/EditMode/Tests.asmdef.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading