Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 7fe36bfd authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files
Conflicts:
	VectoCommon/VectoCommon/Utils/Validation.cs
	VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
	VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
parents 09afe040 36128aa6
No related branches found
No related tags found
No related merge requests found
......@@ -36,6 +36,7 @@ using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Reflection;
using TUGraz.VectoCommon.Models;
namespace TUGraz.VectoCommon.Utils
{
......@@ -49,12 +50,14 @@ namespace TUGraz.VectoCommon.Utils
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity">The entity.</param>
/// <param name="mode">validate the entity for the given execution mode</param>
/// <returns>Null, if the validation was successfull. Otherwise a list of ValidationResults with the ErrorMessages.</returns>
public static IList<ValidationResult> Validate<T>(this T entity)
public static IList<ValidationResult> Validate<T>(this T entity, ExecutionMode mode)
{
var context = new ValidationContext(entity);
context.ServiceContainer.AddService(typeof(ExecutionMode), new ExecutionModeServiceContainer(mode));
var results = new List<ValidationResult>();
Validator.TryValidateObject(entity, new ValidationContext(entity), results, true);
Validator.TryValidateObject(entity, context, results, true);
const BindingFlags flags =
BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public |
......@@ -128,6 +131,16 @@ namespace TUGraz.VectoCommon.Utils
}
}
public class ExecutionModeServiceContainer
{
public ExecutionModeServiceContainer(ExecutionMode mode)
{
Mode = mode;
}
public ExecutionMode Mode { get; protected set; }
}
/// <summary>
/// Determines that the attributed object should be validated recursively.
/// </summary>
......@@ -147,11 +160,14 @@ namespace TUGraz.VectoCommon.Utils
return ValidationResult.Success;
}
var modeService = validationContext.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer;
var mode = modeService != null ? modeService.Mode : ExecutionMode.Declaration;
var enumerable = value as IEnumerable;
if (enumerable != null) {
var i = 0;
foreach (var element in enumerable) {
var results = element.Validate();
var results = element.Validate(mode);
if (results.Any()) {
return new ValidationResult(
string.Format("{1}[{0}] in {1} invalid: {2}", i, validationContext.DisplayName,
......@@ -160,7 +176,7 @@ namespace TUGraz.VectoCommon.Utils
i++;
}
} else {
var results = value.Validate();
var results = value.Validate(mode);
if (!results.Any()) {
return ValidationResult.Success;
}
......
......@@ -151,7 +151,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
throw new ArgumentOutOfRangeException("CycleType unknown:" + data.Cycle.CycleType);
}
var validationErrors = run.Validate();
var validationErrors = run.Validate(_mode);
if (validationErrors.Any()) {
throw new VectoException("Validation of Run-Data Failed: " +
"\n".Join(validationErrors.Select(r => r.ErrorMessage)));
......
......@@ -29,8 +29,10 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System.ComponentModel.DataAnnotations;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
......@@ -50,5 +52,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
public string DigestValue { get; internal set; }
public IntegrityStatus IntegrityStatus { get; internal set; }
protected static ExecutionMode GetExecutionMode(ValidationContext context)
{
var modeService = context.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer;
return modeService == null ? ExecutionMode.Declaration : modeService.Mode;
}
}
}
\ No newline at end of file
......@@ -170,6 +170,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
public static ValidationResult ValidateVehicleData(VehicleData vehicleData, ValidationContext validationContext)
{
var mode = SimulationComponentData.GetExecutionMode(validationContext);
var weightShareSum = vehicleData.AxleData.Sum(axle => axle.AxleWeightShare);
if (!weightShareSum.IsEqual(1.0, 1E-10)) {
return new ValidationResult(
......@@ -180,13 +182,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
// total gvw is limited by max gvw (40t)
var gvwTotal = VectoMath.Min(vehicleData.GrossVehicleWeight + vehicleData.TrailerGrossVehicleWeight,
Constants.SimulationSettings.MaximumGrossVehicleWeight);
if (mode != ExecutionMode.Declaration) {
return ValidationResult.Success;
}
if (vehicleData.TotalVehicleWeight() > gvwTotal) {
return new ValidationResult(
string.Format("Total Vehicle Weight is greater than GrossVehicleWeight! Weight: {0}, GVW: {1}",
vehicleData.TotalVehicleWeight(), gvwTotal));
}
return ValidationResult.Success;
}
}
......
......@@ -137,7 +137,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var vehicle = new VehicleContainer(ExecutionMode.Engineering);
var axleGearData = MockSimulationDataFactory.CreateAxleGearDataFromFile(AxleGearValidRangeDataFile);
var axleGear = new AxleGear(vehicle, axleGearData);
Assert.AreEqual(0, axleGear.Validate().Count);
Assert.AreEqual(0, axleGear.Validate(ExecutionMode.Declaration).Count);
}
[TestCase]
......@@ -146,7 +146,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var vehicle = new VehicleContainer(ExecutionMode.Engineering);
var axleGearData = MockSimulationDataFactory.CreateAxleGearDataFromFile(AxleGearInvalidRangeDataFile);
var axleGear = new AxleGear(vehicle, axleGearData);
var errors = axleGear.Validate();
var errors = axleGear.Validate(ExecutionMode.Declaration);
Assert.AreEqual(1, errors.Count);
}
......
......@@ -29,6 +29,7 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Diagnostics.CodeAnalysis;
......@@ -38,6 +39,7 @@ using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.Reader;
using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
......@@ -53,7 +55,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
[TestClass]
[SuppressMessage("ReSharper", "InconsistentNaming")]
[SuppressMessage("ReSharper", "UnusedMember.Local")]
public class CombustionEngineDataValidationTestClass
public class ValidationTestClass
{
/// <summary>
/// VECTO-107 Check valid range of input parameters
......@@ -90,7 +92,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
};
data.FullLoadCurve.EngineData = data;
var results = data.Validate();
var results = data.Validate(ExecutionMode.Declaration);
Assert.IsFalse(results.Any(), "Validation Failed: " + "; ".Join(results.Select(r => r.ErrorMessage)));
Assert.IsTrue(data.IsValid());
}
......@@ -125,7 +127,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
var engineData = dao.CreateEngineData(data);
var results = engineData.Validate();
var results = engineData.Validate(ExecutionMode.Declaration);
Assert.IsFalse(results.Any(), "Validation failed: " + "; ".Join(results.Select(r => r.ErrorMessage)));
Assert.IsTrue(engineData.IsValid());
}
......@@ -163,11 +165,125 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
var engineData = dao.CreateEngineData(data);
var results = engineData.Validate();
var results = engineData.Validate(ExecutionMode.Declaration);
Assert.IsFalse(results.Any(), "Validation failed: " + "; ".Join(results.Select(r => r.ErrorMessage)));
Assert.IsTrue(engineData.IsValid());
}
[TestMethod]
public void ValidationModeVehicleDataTest()
{
var vehicleData = new VehicleData() {
AxleConfiguration = AxleConfiguration.AxleConfig_4x2,
Creator = "Mr. Test",
CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
CrossWindCorrectionCurve =
new CrosswindCorrectionCdxALookup(CrossWindCorrectionCurveReader.GetNoCorrectionCurve(5.SI<SquareMeter>()),
CrossWindCorrectionMode.NoCorrection),
CurbWeight = 7500.SI<Kilogram>(),
DynamicTyreRadius = 0.5.SI<Meter>(),
CurbWeigthExtra = 0.SI<Kilogram>(),
Loading = 12000.SI<Kilogram>(),
GrossVehicleMassRating = 16000.SI<Kilogram>()
};
vehicleData.AxleData = new List<Axle>() {
new Axle() {
AxleType = AxleType.VehicleNonDriven,
AxleWeightShare = 0.4,
Inertia = 0.5.SI<KilogramSquareMeter>(),
RollResistanceCoefficient = 0.00555,
TyreTestLoad = 33000.SI<Newton>()
},
new Axle() {
AxleType = AxleType.VehicleNonDriven,
AxleWeightShare = 0.6,
Inertia = 0.5.SI<KilogramSquareMeter>(),
RollResistanceCoefficient = 0.00555,
TyreTestLoad = 33000.SI<Newton>()
},
};
var result = vehicleData.Validate(ExecutionMode.Engineering);
Assert.IsTrue(!result.Any());
result = vehicleData.Validate(ExecutionMode.Declaration);
Assert.IsTrue(result.Any(), "validation should have failed, but succeeded");
}
/// <summary>
/// VECTO-107 Check valid range of input parameters
/// </summary>
[TestMethod]
public void ValidationModeVectoRunDataTest()
{
var container = new VehicleContainer(ExecutionMode.Engineering);
var data = new DistanceRun(container);
var engineData = new CombustionEngineData
{
FullLoadCurve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld"),
IdleSpeed = 560.RPMtoRad()
};
var gearboxData = new GearboxData();
gearboxData.Gears[1] = new GearData
{
LossMap = TransmissionLossMap.ReadFromFile(@"TestData\Components\Direct Gear.vtlm", 1, "1"),
Ratio = 1
};
var axleGearData = new AxleGearData
{
AxleGear = new GearData
{
Ratio = 1,
LossMap = TransmissionLossMap.ReadFromFile(@"TestData\Components\limited.vtlm", 1, "1"),
}
};
var vehicleData = new VehicleData()
{
AxleConfiguration = AxleConfiguration.AxleConfig_4x2,
Creator = "Mr. Test",
CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
CrossWindCorrectionCurve =
new CrosswindCorrectionCdxALookup(CrossWindCorrectionCurveReader.GetNoCorrectionCurve(5.SI<SquareMeter>()),
CrossWindCorrectionMode.NoCorrection),
CurbWeight = 7500.SI<Kilogram>(),
DynamicTyreRadius = 0.5.SI<Meter>(),
CurbWeigthExtra = 0.SI<Kilogram>(),
Loading = 12000.SI<Kilogram>(),
GrossVehicleMassRating = 16000.SI<Kilogram>()
};
vehicleData.AxleData = new List<Axle>() {
new Axle() {
AxleType = AxleType.VehicleNonDriven,
AxleWeightShare = 0.4,
Inertia = 0.5.SI<KilogramSquareMeter>(),
RollResistanceCoefficient = 0.00555,
TyreTestLoad = 33000.SI<Newton>()
},
new Axle() {
AxleType = AxleType.VehicleNonDriven,
AxleWeightShare = 0.6,
Inertia = 0.5.SI<KilogramSquareMeter>(),
RollResistanceCoefficient = 0.00555,
TyreTestLoad = 33000.SI<Newton>()
},
};
container.RunData = new VectoRunData
{
VehicleData = vehicleData,
GearboxData = gearboxData,
EngineData = engineData,
AxleGearData = axleGearData
};
var results = data.Validate(ExecutionMode.Declaration);
Assert.IsTrue(results.Any(), "Validation should have failed, but succeded.");
results = vehicleData.Validate(ExecutionMode.Engineering);
Assert.IsTrue(!results.Any());
}
/// <summary>
/// VECTO-107 Check valid range of input parameters
/// </summary>
......@@ -200,7 +316,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
AxleGearData = axleGearData
};
var results = data.Validate();
var results = data.Validate(ExecutionMode.Declaration);
Assert.IsTrue(results.Any(), "Validation should have failed, but succeded.");
}
......@@ -210,7 +326,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
[TestMethod]
public void Validation_Test()
{
var results = new DataObject().Validate();
var results = new DataObject().Validate(ExecutionMode.Declaration);
// every field and property should be tested except private parent fields and properties and
// (4*4+1) * 2 = 17*2= 34 - 4 private parent fields (+2 public field and property which are tested twice) = 32
......@@ -237,7 +353,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
VectoCSVFile.ReadStream(
InputDataHelper.InputDataAsStream("engine torque,downshift rpm [rpm],upshift rpm [rpm] ", vgbs)));
var results = shiftPolygon.Validate();
var results = shiftPolygon.Validate(ExecutionMode.Declaration);
Assert.IsFalse(results.Any());
shiftPolygon =
......@@ -245,7 +361,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
VectoCSVFile.ReadStream(
InputDataHelper.InputDataAsStream("engine torque,upshift rpm [rpm], downshift rpm [rpm] ", vgbs)));
results = shiftPolygon.Validate();
results = shiftPolygon.Validate(ExecutionMode.Declaration);
Assert.IsTrue(results.Any());
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment