Mantis 3164. Thank you kindly, TLaukkan (Tommil) for a patch that:

* Added tests for manager, user and group lists.
* Added test for ban list. The test had to be left as ignored as 
native MySQL throws exception when ban is saved.
* Added utility class to support parametrized unit tests for range checking.
0.6.3-post-fixes
Charles Krinke 2009-02-14 22:31:39 +00:00
parent a2d17dfff1
commit 38b1f2dbfc
3 changed files with 494 additions and 88 deletions

View File

@ -7,7 +7,7 @@ CREATE TABLE EstateSettings (
RedirectGridY INT NULL,
BillableFactor REAL NULL,
PricePerMeter INT NULL,
SunPosition REAL NULL,
SunPosition FLOAT NULL,
UseGlobalTime BIT NULL,
FixedSun BIT NULL,

View File

@ -32,6 +32,7 @@ using NUnit.Framework.SyntaxHelpers;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using System.Text;
namespace OpenSim.Data.Tests
{
@ -39,9 +40,18 @@ namespace OpenSim.Data.Tests
{
public IEstateDataStore db;
public IRegionDataStore regionDb;
public UUID prim1;
public static Random random;
public static UUID REGION_ID = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed7");
public static UUID USER_ID_1 = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed1");
public static UUID USER_ID_2 = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed2");
public static UUID MANAGER_ID_1 = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed3");
public static UUID MANAGER_ID_2 = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed4");
public static UUID GROUP_ID_1 = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed5");
public static UUID GROUP_ID_2 = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed6");
public void SuperInit()
{
try
@ -52,103 +62,437 @@ namespace OpenSim.Data.Tests
{
// I don't care, just leave log4net off
}
prim1 = UUID.Random();
random = new Random();
}
#region 0Tests
[Test]
public void T010_StoreEstateSettings()
public void T010_EstateSettingsSimpleStorage_MinimumParameterSet()
{
// Initializing field values. Avoid randomness. For checking ranges use different parameter sets
// for mix and max values. If you use random values the tests are not _repeatable_.
string estateName = "test-estate";
uint parentEstateID = 2;
float billableFactor = 3;
int priceMeter = 4;
int redirectGridX = 5;
int redirectGridY = 6;
bool useGlobalTime = true;
bool fixedSun = true;
double sunPosition = 7;
bool allowVoice = true;
bool allowDirectTeleport = true;
bool resetHomeOnTeleport = true;
bool denyAnonymous = true;
bool denyIdentified = true;
bool denyTransacted = true;
bool abuseEmailtoEstateOwner = true;
bool blockDwell = true;
bool estateskipScripts = true;
bool taxFree = true;
bool publicAccess = true;
string abuseMail = "test-email@nowhere.com";
UUID estateOwner = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed7");
bool denyMinors = (random.NextDouble() > 0.5)? true : false;
EstateSettingsSimpleStorage(
REGION_ID,
DataTestUtil.STRING_MIN,
DataTestUtil.UNSIGNED_INTEGER_MIN,
DataTestUtil.FLOAT_MIN,
DataTestUtil.INTEGER_MIN,
DataTestUtil.INTEGER_MIN,
DataTestUtil.INTEGER_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.DOUBLE_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.STRING_MIN,
DataTestUtil.UUID_MIN
);
}
// Lets choose random region ID
UUID regionId = new UUID("250d214e-1c7e-4f9b-a488-87c5e53feed7");
[Test]
public void T011_EstateSettingsSimpleStorage_MaximumParameterSet()
{
EstateSettingsSimpleStorage(
REGION_ID,
DataTestUtil.STRING_MAX(64),
DataTestUtil.UNSIGNED_INTEGER_MAX,
DataTestUtil.FLOAT_MAX,
DataTestUtil.INTEGER_MAX,
DataTestUtil.INTEGER_MAX,
DataTestUtil.INTEGER_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.DOUBLE_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.BOOLEAN_MAX,
DataTestUtil.STRING_MAX(255),
DataTestUtil.UUID_MAX
);
}
[Test]
public void T012_EstateSettingsSimpleStorage_AccurateParameterSet()
{
EstateSettingsSimpleStorage(
REGION_ID,
DataTestUtil.STRING_MAX(1),
DataTestUtil.UNSIGNED_INTEGER_MIN,
DataTestUtil.FLOAT_ACCURATE,
DataTestUtil.INTEGER_MIN,
DataTestUtil.INTEGER_MIN,
DataTestUtil.INTEGER_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.DOUBLE_ACCURATE,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.BOOLEAN_MIN,
DataTestUtil.STRING_MAX(1),
DataTestUtil.UUID_MIN
);
}
[Test]
public void T020_EstateSettingsManagerList()
{
// Letting estate store generate rows to database for us
EstateSettings es = db.LoadEstateSettings(regionId);
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID);
// Setting field values to the on demand create settings object.
es.EstateName = estateName;
es.ParentEstateID = parentEstateID;
es.BillableFactor = billableFactor;
es.PricePerMeter = priceMeter;
es.RedirectGridX = redirectGridX;
es.RedirectGridY = redirectGridY;
es.UseGlobalTime = useGlobalTime;
es.FixedSun = fixedSun;
es.SunPosition = sunPosition;
es.AllowVoice = allowVoice;
es.AllowDirectTeleport = allowDirectTeleport;
es.ResetHomeOnTeleport = resetHomeOnTeleport;
es.DenyAnonymous = denyAnonymous;
es.DenyIdentified = denyIdentified;
es.DenyTransacted = denyTransacted;
es.AbuseEmailToEstateOwner = abuseEmailtoEstateOwner;
es.BlockDwell = blockDwell;
es.EstateSkipScripts = estateskipScripts;
es.TaxFree = taxFree;
es.PublicAccess = publicAccess;
es.AbuseEmail = abuseMail;
es.EstateOwner = estateOwner;
es.DenyMinors = denyMinors;
originalSettings.EstateManagers = new UUID[] { MANAGER_ID_1, MANAGER_ID_2 };
// Saving settings.
db.StoreEstateSettings(es);
db.StoreEstateSettings(originalSettings);
// Loading settings to another instance variable.
EstateSettings nes = db.LoadEstateSettings(regionId);
EstateSettings loadedSettings = db.LoadEstateSettings(REGION_ID);
// Checking that loaded values are correct.
Assert.That(estateName, Is.EqualTo(nes.EstateName));
Assert.That(parentEstateID, Is.EqualTo(nes.ParentEstateID));
Assert.That(billableFactor, Is.EqualTo(nes.BillableFactor));
Assert.That(priceMeter, Is.EqualTo(nes.PricePerMeter));
Assert.That(redirectGridX, Is.EqualTo(nes.RedirectGridX));
Assert.That(redirectGridY, Is.EqualTo(nes.RedirectGridY));
Assert.That(useGlobalTime, Is.EqualTo(nes.UseGlobalTime));
Assert.That(fixedSun, Is.EqualTo(nes.FixedSun));
Assert.That(sunPosition, Is.EqualTo(nes.SunPosition));
Assert.That(allowVoice, Is.EqualTo(nes.AllowVoice));
Assert.That(allowDirectTeleport, Is.EqualTo(nes.AllowDirectTeleport));
Assert.That(resetHomeOnTeleport, Is.EqualTo(nes.ResetHomeOnTeleport));
Assert.That(denyAnonymous, Is.EqualTo(nes.DenyAnonymous));
Assert.That(denyIdentified, Is.EqualTo(nes.DenyIdentified));
Assert.That(denyTransacted, Is.EqualTo(nes.DenyTransacted));
Assert.That(abuseEmailtoEstateOwner, Is.EqualTo(nes.AbuseEmailToEstateOwner));
Assert.That(blockDwell, Is.EqualTo(nes.BlockDwell));
Assert.That(estateskipScripts, Is.EqualTo(nes.EstateSkipScripts));
Assert.That(taxFree, Is.EqualTo(nes.TaxFree));
Assert.That(publicAccess, Is.EqualTo(nes.PublicAccess));
Assert.That(abuseMail, Is.EqualTo(nes.AbuseEmail));
Assert.That(estateOwner, Is.EqualTo(nes.EstateOwner));
Assert.That(denyMinors, Is.EqualTo(nes.DenyMinors));
Assert.AreEqual(2, loadedSettings.EstateManagers.Length);
Assert.AreEqual(MANAGER_ID_1, loadedSettings.EstateManagers[0]);
Assert.AreEqual(MANAGER_ID_2, loadedSettings.EstateManagers[1]);
}
[Test]
public void T021_EstateSettingsUserList()
{
// Letting estate store generate rows to database for us
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID);
originalSettings.EstateAccess = new UUID[] { USER_ID_1, USER_ID_2 };
// Saving settings.
db.StoreEstateSettings(originalSettings);
// Loading settings to another instance variable.
EstateSettings loadedSettings = db.LoadEstateSettings(REGION_ID);
Assert.AreEqual(2, loadedSettings.EstateAccess.Length);
Assert.AreEqual(USER_ID_1, loadedSettings.EstateAccess[0]);
Assert.AreEqual(USER_ID_2, loadedSettings.EstateAccess[1]);
}
[Test]
public void T022_EstateSettingsGroupList()
{
// Letting estate store generate rows to database for us
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID);
originalSettings.EstateGroups = new UUID[] { GROUP_ID_1, GROUP_ID_2 };
// Saving settings.
db.StoreEstateSettings(originalSettings);
// Loading settings to another instance variable.
EstateSettings loadedSettings = db.LoadEstateSettings(REGION_ID);
Assert.AreEqual(2, loadedSettings.EstateAccess.Length);
Assert.AreEqual(GROUP_ID_1, loadedSettings.EstateGroups[0]);
Assert.AreEqual(GROUP_ID_2, loadedSettings.EstateGroups[1]);
}
[Test]
public void T022_EstateSettingsBanList()
{
// This is not working on native MySQL so ignoring.
Assert.Ignore();
// Letting estate store generate rows to database for us
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID);
EstateBan estateBan1 = new EstateBan();
estateBan1.bannedIP = DataTestUtil.STRING_MIN;
estateBan1.bannedIPHostMask = DataTestUtil.STRING_MIN;
estateBan1.bannedNameMask = DataTestUtil.STRING_MIN;
estateBan1.bannedUUID = DataTestUtil.UUID_MIN;
EstateBan estateBan2 = new EstateBan();
estateBan2.bannedIP = DataTestUtil.STRING_MAX(16);
estateBan2.bannedIPHostMask = DataTestUtil.STRING_MAX(16);
estateBan2.bannedNameMask = DataTestUtil.STRING_MAX(64);
estateBan2.bannedUUID = DataTestUtil.UUID_MAX;
originalSettings.EstateBans = new EstateBan[] { estateBan1, estateBan2 };
// Saving settings.
db.StoreEstateSettings(originalSettings);
// Loading settings to another instance variable.
EstateSettings loadedSettings = db.LoadEstateSettings(REGION_ID);
Assert.AreEqual(2, loadedSettings.EstateBans.Length);
Assert.AreEqual(DataTestUtil.STRING_MIN, loadedSettings.EstateBans[0].bannedIP);
Assert.AreEqual(DataTestUtil.STRING_MIN, loadedSettings.EstateBans[0].bannedIPHostMask);
Assert.AreEqual(DataTestUtil.STRING_MIN, loadedSettings.EstateBans[0].bannedNameMask);
Assert.AreEqual(DataTestUtil.UUID_MIN, loadedSettings.EstateBans[0].bannedUUID);
Assert.AreEqual(DataTestUtil.STRING_MAX(16), loadedSettings.EstateBans[1].bannedIP);
Assert.AreEqual(DataTestUtil.STRING_MAX(16), loadedSettings.EstateBans[1].bannedIPHostMask);
Assert.AreEqual(DataTestUtil.STRING_MAX(64), loadedSettings.EstateBans[1].bannedNameMask);
Assert.AreEqual(DataTestUtil.UUID_MAX, loadedSettings.EstateBans[1].bannedUUID);
}
#endregion
#region Parametrizable Test Implementations
private void EstateSettingsSimpleStorage(
UUID regionId,
string estateName,
uint parentEstateID,
float billableFactor,
int pricePerMeter,
int redirectGridX,
int redirectGridY,
bool useGlobalTime,
bool fixedSun,
double sunPosition,
bool allowVoice,
bool allowDirectTeleport,
bool resetHomeOnTeleport,
bool denyAnonymous,
bool denyIdentified,
bool denyTransacted,
bool denyMinors,
bool abuseEmailToEstateOwner,
bool blockDwell,
bool estateSkipScripts,
bool taxFree,
bool publicAccess,
string abuseEmail,
UUID estateOwner
)
{
// Letting estate store generate rows to database for us
EstateSettings originalSettings = db.LoadEstateSettings(regionId);
SetEstateSettings(
originalSettings,
estateName,
parentEstateID,
billableFactor,
pricePerMeter,
redirectGridX,
redirectGridY,
useGlobalTime,
fixedSun,
sunPosition,
allowVoice,
allowDirectTeleport,
resetHomeOnTeleport,
denyAnonymous,
denyIdentified,
denyTransacted,
denyMinors,
abuseEmailToEstateOwner,
blockDwell,
estateSkipScripts,
taxFree,
publicAccess,
abuseEmail,
estateOwner
);
originalSettings.EstateName = estateName;
originalSettings.ParentEstateID = parentEstateID;
originalSettings.BillableFactor = billableFactor;
originalSettings.PricePerMeter = pricePerMeter;
originalSettings.RedirectGridX = redirectGridX;
originalSettings.RedirectGridY = redirectGridY;
originalSettings.UseGlobalTime = useGlobalTime;
originalSettings.FixedSun = fixedSun;
originalSettings.SunPosition = sunPosition;
originalSettings.AllowVoice = allowVoice;
originalSettings.AllowDirectTeleport = allowDirectTeleport;
originalSettings.ResetHomeOnTeleport = resetHomeOnTeleport;
originalSettings.DenyAnonymous = denyAnonymous;
originalSettings.DenyIdentified = denyIdentified;
originalSettings.DenyTransacted = denyTransacted;
originalSettings.DenyMinors = denyMinors;
originalSettings.AbuseEmailToEstateOwner = abuseEmailToEstateOwner;
originalSettings.BlockDwell = blockDwell;
originalSettings.EstateSkipScripts = estateSkipScripts;
originalSettings.TaxFree = taxFree;
originalSettings.PublicAccess = publicAccess;
originalSettings.AbuseEmail = abuseEmail;
originalSettings.EstateOwner = estateOwner;
// Saving settings.
db.StoreEstateSettings(originalSettings);
// Loading settings to another instance variable.
EstateSettings loadedSettings = db.LoadEstateSettings(regionId);
// Checking that loaded values are correct.
ValidateEstateSettings(
loadedSettings,
estateName,
parentEstateID,
billableFactor,
pricePerMeter,
redirectGridX,
redirectGridY,
useGlobalTime,
fixedSun,
sunPosition,
allowVoice,
allowDirectTeleport,
resetHomeOnTeleport,
denyAnonymous,
denyIdentified,
denyTransacted,
denyMinors,
abuseEmailToEstateOwner,
blockDwell,
estateSkipScripts,
taxFree,
publicAccess,
abuseEmail,
estateOwner
);
}
#endregion
#region EstateSetting Initialization and Validation Methods
private void SetEstateSettings(
EstateSettings estateSettings,
string estateName,
uint parentEstateID,
float billableFactor,
int pricePerMeter,
int redirectGridX,
int redirectGridY,
bool useGlobalTime,
bool fixedSun,
double sunPosition,
bool allowVoice,
bool allowDirectTeleport,
bool resetHomeOnTeleport,
bool denyAnonymous,
bool denyIdentified,
bool denyTransacted,
bool denyMinors,
bool abuseEmailToEstateOwner,
bool blockDwell,
bool estateSkipScripts,
bool taxFree,
bool publicAccess,
string abuseEmail,
UUID estateOwner
)
{
estateSettings.EstateName = estateName;
estateSettings.ParentEstateID = parentEstateID;
estateSettings.BillableFactor = billableFactor;
estateSettings.PricePerMeter = pricePerMeter;
estateSettings.RedirectGridX = redirectGridX;
estateSettings.RedirectGridY = redirectGridY;
estateSettings.UseGlobalTime = useGlobalTime;
estateSettings.FixedSun = fixedSun;
estateSettings.SunPosition = sunPosition;
estateSettings.AllowVoice = allowVoice;
estateSettings.AllowDirectTeleport = allowDirectTeleport;
estateSettings.ResetHomeOnTeleport = resetHomeOnTeleport;
estateSettings.DenyAnonymous = denyAnonymous;
estateSettings.DenyIdentified = denyIdentified;
estateSettings.DenyTransacted = denyTransacted;
estateSettings.DenyMinors = denyMinors;
estateSettings.AbuseEmailToEstateOwner = abuseEmailToEstateOwner;
estateSettings.BlockDwell = blockDwell;
estateSettings.EstateSkipScripts = estateSkipScripts;
estateSettings.TaxFree = taxFree;
estateSettings.PublicAccess = publicAccess;
estateSettings.AbuseEmail = abuseEmail;
estateSettings.EstateOwner = estateOwner;
}
private void ValidateEstateSettings(
EstateSettings estateSettings,
string estateName,
uint parentEstateID,
float billableFactor,
int pricePerMeter,
int redirectGridX,
int redirectGridY,
bool useGlobalTime,
bool fixedSun,
double sunPosition,
bool allowVoice,
bool allowDirectTeleport,
bool resetHomeOnTeleport,
bool denyAnonymous,
bool denyIdentified,
bool denyTransacted,
bool denyMinors,
bool abuseEmailToEstateOwner,
bool blockDwell,
bool estateSkipScripts,
bool taxFree,
bool publicAccess,
string abuseEmail,
UUID estateOwner
)
{
Assert.AreEqual(estateName, estateSettings.EstateName);
Assert.AreEqual(parentEstateID, estateSettings.ParentEstateID);
DataTestUtil.AssertFloatEqualsWithTolerance(billableFactor, estateSettings.BillableFactor);
Assert.AreEqual(pricePerMeter, estateSettings.PricePerMeter);
Assert.AreEqual(redirectGridX, estateSettings.RedirectGridX);
Assert.AreEqual(redirectGridY, estateSettings.RedirectGridY);
Assert.AreEqual(useGlobalTime, estateSettings.UseGlobalTime);
Assert.AreEqual(fixedSun, estateSettings.FixedSun);
DataTestUtil.AssertDoubleEqualsWithTolerance(sunPosition, estateSettings.SunPosition);
Assert.AreEqual(allowVoice, estateSettings.AllowVoice);
Assert.AreEqual(allowDirectTeleport, estateSettings.AllowDirectTeleport);
Assert.AreEqual(resetHomeOnTeleport, estateSettings.ResetHomeOnTeleport);
Assert.AreEqual(denyAnonymous, estateSettings.DenyAnonymous);
Assert.AreEqual(denyIdentified, estateSettings.DenyIdentified);
Assert.AreEqual(denyTransacted, estateSettings.DenyTransacted);
Assert.AreEqual(denyMinors, estateSettings.DenyMinors);
Assert.AreEqual(abuseEmailToEstateOwner, estateSettings.AbuseEmailToEstateOwner);
Assert.AreEqual(blockDwell, estateSettings.BlockDwell);
Assert.AreEqual(estateSkipScripts, estateSettings.EstateSkipScripts);
Assert.AreEqual(taxFree, estateSettings.TaxFree);
Assert.AreEqual(publicAccess, estateSettings.PublicAccess);
Assert.AreEqual(abuseEmail, estateSettings.AbuseEmail);
Assert.AreEqual(estateOwner, estateSettings.EstateOwner);
}
#endregion
}
}

View File

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Text;
using OpenMetaverse;
using NUnit.Framework;
namespace OpenSim.Data.Tests
{
/// <summary>
/// Shared constants and methods for database unit tests.
/// </summary>
public class DataTestUtil
{
public const uint UNSIGNED_INTEGER_MIN = uint.MinValue;
public const uint UNSIGNED_INTEGER_MAX = uint.MaxValue / 2; // NHibernate does not support unsigned integer range.
public const int INTEGER_MIN = int.MinValue + 1; // Postgresql requires +1 to .NET int.MinValue
public const int INTEGER_MAX = int.MaxValue;
public const float FLOAT_MIN = float.MinValue * (1 - FLOAT_PRECISSION);
public const float FLOAT_MAX = float.MaxValue * (1 - FLOAT_PRECISSION);
public const float FLOAT_ACCURATE = 1.234567890123456789012f;
public const float FLOAT_PRECISSION = 1E-5f; // Native MySQL is severly limited with floating accuracy
public const double DOUBLE_MIN = -1E52 * (1 - DOUBLE_PRECISSION);
public const double DOUBLE_MAX = 1E52 * (1 - DOUBLE_PRECISSION);
public const double DOUBLE_ACCURATE = 1.2345678901234567890123456789012345678901234567890123f;
public const double DOUBLE_PRECISSION = 1E-14; // Native MySQL is severly limited with double accuracy
public const string STRING_MIN = "";
public static string STRING_MAX(int length)
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < length; i++)
{
stringBuilder.Append(i % 10);
}
return stringBuilder.ToString();
}
public static UUID UUID_MIN = new UUID("00000000-0000-0000-0000-000000000000");
public static UUID UUID_MAX = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff");
public const bool BOOLEAN_MIN = false;
public const bool BOOLEAN_MAX = true;
public static void AssertFloatEqualsWithTolerance(float expectedValue, float actualValue)
{
Assert.GreaterOrEqual(actualValue, expectedValue - Math.Abs(expectedValue) * FLOAT_PRECISSION);
Assert.LessOrEqual(actualValue, expectedValue + Math.Abs(expectedValue) * FLOAT_PRECISSION);
}
public static void AssertDoubleEqualsWithTolerance(double expectedValue, double actualValue)
{
Assert.GreaterOrEqual(actualValue, expectedValue - Math.Abs(expectedValue) * DOUBLE_PRECISSION);
Assert.LessOrEqual(actualValue, expectedValue + Math.Abs(expectedValue) * DOUBLE_PRECISSION);
}
}
}