Daniele Teti 2023-01-29 17:29:24 +01:00
parent c03315077e
commit 0023ebe32c
12 changed files with 2636 additions and 70 deletions

View File

@ -1423,16 +1423,22 @@ The current beta release is named 3.2.3-radium-beta. If you want to stay on the-
- mid-air-collision handling now uses SHA1 instead of MD5
- Added `MVCFramework.Commons.MVC_HTTP_STATUS_CODES` const array containing all the HTTP status codes with its `ReasonString`
- Added `MVCFramework.Commons.MVC_HTTP_STATUS_CODES` const array containing all the HTTP status codes with its `ReasonString`.
- Support for `TObject` descendants in JSONRPC APIs (not only for JSONObject and JSONArray).
- New global configuration variable `MVCSerializeNulls`.
When MVCSerializeNulls = True (default) empty nullables and nil are serialized as json null.
When MVCSerializeNulls = False empty nullables and nil are not serialized at all.
- Nullable types now have `Equal` support and a better "equality check" strategy.
- Nullable types now have `Equal` method support, the new method `TryHasValue(out Value)` works like `HasValue` but returns the contained value if present. Also there is a better "equality check" strategy.
- Unit tests now are always executed for Win32 and Win64 bit (both client and server).
- Added `TMVCActiveRecord.Refresh` method
- Unit test suites generates one NUnit XML output file for each platform
- New built-in profiler (usable with Delphi 10.4+) - to profile a block of code, write the following
```delphi

View File

@ -258,6 +258,15 @@ object MainForm: TMainForm
TabOrder = 24
OnClick = btnSpeedClick
end
object btnRefresh: TButton
Left = 144
Top = 442
Width = 121
Height = 34
Caption = 'Manual Refresh'
TabOrder = 25
OnClick = btnRefreshClick
end
object FDConnection1: TFDConnection
Left = 312
Top = 40

View File

@ -57,6 +57,7 @@ type
btnOOP: TButton;
btnReadOnly: TButton;
btnSpeed: TButton;
btnRefresh: TButton;
procedure btnCRUDClick(Sender: TObject);
procedure btnInheritanceClick(Sender: TObject);
procedure btnMultiThreadingClick(Sender: TObject);
@ -84,6 +85,7 @@ type
procedure btnOOPClick(Sender: TObject);
procedure btnReadOnlyClick(Sender: TObject);
procedure btnSpeedClick(Sender: TObject);
procedure btnRefreshClick(Sender: TObject);
private
procedure Log(const Value: string);
procedure LoadCustomers;
@ -1467,6 +1469,44 @@ begin
end;
end;
procedure TMainForm.btnRefreshClick(Sender: TObject);
var
lCustomer: TCustomer;
lID: Integer;
begin
Log('** Refresh test');
lCustomer := TCustomer.Create;
try
Log('Entity ' + TCustomer.ClassName + ' is mapped to table ' + lCustomer.TableName);
lCustomer.CompanyName := 'Google Inc.';
lCustomer.City := 'Montain View, CA';
lCustomer.Note := 'Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην 😁';
lCustomer.Insert;
Assert('Montain View, CA' = lCustomer.City);
Assert('Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην 😁' = lCustomer.Note);
lCustomer.City := '';
lCustomer.Note := '';
Log('Refreshing the customer');
lCustomer.Refresh;
Assert('Montain View, CA' = lCustomer.City);
Assert('Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην 😁' = lCustomer.Note);
lID := lCustomer.ID;
finally
lCustomer.Free;
end;
lCustomer := TCustomer.Create;
try
Log('Loading customer using Refresh');
lCustomer.ID := lID;
lCustomer.Refresh;
Assert('Montain View, CA' = lCustomer.City);
Assert('Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην 😁' = lCustomer.Note);
finally
lCustomer.Free;
end;
end;
procedure TMainForm.btnValidationClick(Sender: TObject);
var
lCustomer: TCustomerWithLogic;

View File

@ -220,12 +220,12 @@
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libPCRE.dylib" Class="DependencyModule"/>
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule">
<Platform Name="iOSSimulator">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libPCRE.dylib" Class="DependencyModule"/>
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgsqlite3.dylib" Class="DependencyModule"/>
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule">
<Platform Name="OSX32">

View File

@ -195,7 +195,6 @@ type
fDefaultRQLFilter: string;
fMap: TFieldsMap;
fPrimaryKey: TRTTIField;
//fBackendDriver: string;
fMapping: TMVCFieldsMapping;
fPropsAttributes: TArray<TCustomAttribute>;
fProps: TArray<TRTTIField>;
@ -224,25 +223,7 @@ type
procedure SetAttributes(const AttrName: string; const Value: TValue);
function GetTableName: string;
protected
// fPrimaryKeyFieldName: string;
// fPrimaryKeyOptions: TMVCActiveRecordFieldOptions;
// fPrimaryKeySequenceName: string;
// fPrimaryKeyFieldType: TFieldType;
// fEntityAllowedActions: TMVCEntityActions;
// fRTTIType: TRttiInstanceType;
// fObjAttributes: TArray<TCustomAttribute>;
// fTableName: string;
// fDefaultRQLFilter: string;
// fMap: TFieldsMap;
// fPrimaryKey: TRTTIField;
fBackendDriver: string;
// fMapping: TMVCFieldsMapping;
// fPropsAttributes: TArray<TCustomAttribute>;
// fProps: TArray<TRTTIField>;
// fPartitionInfoInternal: TPartitionInfo;
// fPartitionClause: String;
fTableMap: TMVCTableMap;
function GetPartitionInfo: TPartitionInfo;
function GetBackEnd: string;
@ -280,6 +261,7 @@ type
class function GetByPK(aActiveRecord: TMVCActiveRecord; const aValue: string; const aFieldType: TFieldType;
const RaiseExceptionIfNotFound: Boolean): TMVCActiveRecord; overload;
// load events
/// <summary>
/// Called everywhere before persist object into database
@ -364,6 +346,10 @@ type
/// Executes an Insert (pk is null) or an Update (pk is not null)
/// </summary>
procedure Store;
/// <summary>
/// Reload the current instance from database if the primary key is not empty.
/// </summary>
procedure Refresh; virtual;
function CheckAction(const aEntityAction: TMVCEntityAction;
const aRaiseException: Boolean = True): Boolean;
procedure Insert;
@ -2381,6 +2367,29 @@ begin
// do nothing
end;
procedure TMVCActiveRecord.Refresh;
begin
if not GetPK.IsEmpty then
begin
case GetPrimaryKeyFieldType of
ftLargeInt: begin
LoadByPK(GetPK.AsInt64);
end;
ftInteger: begin
LoadByPK(GetPK.AsInteger);
end;
ftString: begin
LoadByPK(GetPK.AsString);
end;
ftGuid: begin
LoadByPK(GetPK.AsType<TGUID>);
end;
else
raise EMVCActiveRecord.Create('Unknown primary key type');
end;
end;
end;
procedure TMVCActiveRecord.RemoveChildren(const ChildObject: TObject);
begin
if fChildren <> nil then
@ -2885,51 +2894,35 @@ begin
begin
if Value.IsType<NullableInt32>() then
begin
Result := Value.AsType<NullableInt32>().HasValue;
if Result then
Value := Value.AsType<NullableInt32>().Value;
Result := Value.AsType<NullableInt32>().TryHasValue(Value);
end
else if Value.IsType<NullableInt64>() then
begin
Result := Value.AsType<NullableInt64>().HasValue;
if Result then
Value := Value.AsType<NullableInt64>().Value;
Result := Value.AsType<NullableInt64>().TryHasValue(Value)
end
else if Value.IsType<NullableUInt32>() then
begin
Result := Value.AsType<NullableUInt32>().HasValue;
if Result then
Value := Value.AsType<NullableUInt32>().Value;
Result := Value.AsType<NullableUInt32>().TryHasValue(Value)
end
else if Value.IsType<NullableUInt64>() then
begin
Result := Value.AsType<NullableUInt64>().HasValue;
if Result then
Value := Value.AsType<NullableUInt64>().Value;
Result := Value.AsType<NullableUInt64>().TryHasValue(Value)
end
else if Value.IsType<NullableInt16>() then
begin
Result := Value.AsType<NullableInt16>().HasValue;
if Result then
Value := Value.AsType<NullableInt16>().Value;
Result := Value.AsType<NullableInt16>().TryHasValue(Value)
end
else if Value.IsType<NullableUInt16>() then
begin
Result := Value.AsType<NullableUInt16>().HasValue;
if Result then
Value := Value.AsType<NullableUInt16>().Value;
Result := Value.AsType<NullableUInt16>().TryHasValue(Value)
end
else if Value.IsType<NullableString>() then
begin
Result := Value.AsType<NullableString>().HasValue;
if Result then
Value := Value.AsType<NullableString>().Value;
Result := Value.AsType<NullableString>().TryHasValue(Value)
end
else if Value.IsType<NullableTGUID>() then
begin
Result := Value.AsType<NullableTGUID>().HasValue;
if Result then
Value := TValue.From<TGuid>(Value.AsType<NullableTGUID>().Value);
Result := Value.AsType<NullableTGUID>().TryHasValue(Value)
end
else
raise EMVCActiveRecord.Create

View File

@ -32,7 +32,7 @@ unit MVCFramework.Nullables;
interface
uses
System.SysUtils, System.Classes, System.TypInfo;
System.SysUtils, System.Classes, System.TypInfo, System.RTTI;
type
EMVCNullable = class(Exception)
@ -82,6 +82,14 @@ type
/// </summary>
function Equals(const Value: NullableString): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: String): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: String read GetValue write SetValue;
@ -130,6 +138,14 @@ type
/// </summary>
function Equals(const Value: NullableCurrency): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Currency): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Currency read GetValue write SetValue;
@ -178,6 +194,14 @@ type
/// </summary>
function Equals(const Value: NullableBoolean): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Boolean): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Boolean read GetValue write SetValue;
@ -226,6 +250,14 @@ type
/// </summary>
function Equals(const Value: NullableTDate): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TDate): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: TDate read GetValue write SetValue;
@ -274,6 +306,14 @@ type
/// </summary>
function Equals(const Value: NullableTTime): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TTime): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: TTime read GetValue write SetValue;
@ -322,6 +362,14 @@ type
/// </summary>
function Equals(const Value: NullableTDateTime): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TDateTime): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: TDateTime read GetValue write SetValue;
@ -370,6 +418,14 @@ type
/// </summary>
function Equals(const Value: NullableSingle): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Single): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Single read GetValue write SetValue;
@ -418,6 +474,14 @@ type
/// </summary>
function Equals(const Value: NullableDouble): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Double): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Double read GetValue write SetValue;
@ -466,6 +530,14 @@ type
/// </summary>
function Equals(const Value: NullableExtended): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Extended): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Extended read GetValue write SetValue;
@ -514,6 +586,14 @@ type
/// </summary>
function Equals(const Value: NullableInt16): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Int16): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Int16 read GetValue write SetValue;
@ -562,6 +642,14 @@ type
/// </summary>
function Equals(const Value: NullableUInt16): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: UInt16): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: UInt16 read GetValue write SetValue;
@ -610,6 +698,14 @@ type
/// </summary>
function Equals(const Value: NullableInt32): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Int32): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Int32 read GetValue write SetValue;
@ -658,6 +754,14 @@ type
/// </summary>
function Equals(const Value: NullableUInt32): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: UInt32): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: UInt32 read GetValue write SetValue;
@ -706,6 +810,14 @@ type
/// </summary>
function Equals(const Value: NullableInt64): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: Int64): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: Int64 read GetValue write SetValue;
@ -754,6 +866,14 @@ type
/// </summary>
function Equals(const Value: NullableUInt64): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: UInt64): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: UInt64 read GetValue write SetValue;
@ -802,6 +922,14 @@ type
/// </summary>
function Equals(const Value: NullableTGUID): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TGUID): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: TGUID read GetValue write SetValue;
@ -845,6 +973,25 @@ begin
end;
end;
function NullableString.TryHasValue(out Value: String): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableString.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<String>(fValue);
end;
end;
procedure NullableString.Clear;
begin
SetNull;
@ -935,6 +1082,25 @@ begin
end;
end;
function NullableCurrency.TryHasValue(out Value: Currency): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableCurrency.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Currency>(fValue);
end;
end;
procedure NullableCurrency.Clear;
begin
SetNull;
@ -1025,6 +1191,25 @@ begin
end;
end;
function NullableBoolean.TryHasValue(out Value: Boolean): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableBoolean.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Boolean>(fValue);
end;
end;
procedure NullableBoolean.Clear;
begin
SetNull;
@ -1115,6 +1300,25 @@ begin
end;
end;
function NullableTDate.TryHasValue(out Value: TDate): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableTDate.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<TDate>(fValue);
end;
end;
procedure NullableTDate.Clear;
begin
SetNull;
@ -1205,6 +1409,25 @@ begin
end;
end;
function NullableTTime.TryHasValue(out Value: TTime): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableTTime.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<TTime>(fValue);
end;
end;
procedure NullableTTime.Clear;
begin
SetNull;
@ -1295,6 +1518,25 @@ begin
end;
end;
function NullableTDateTime.TryHasValue(out Value: TDateTime): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableTDateTime.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<TDateTime>(fValue);
end;
end;
procedure NullableTDateTime.Clear;
begin
SetNull;
@ -1385,6 +1627,25 @@ begin
end;
end;
function NullableSingle.TryHasValue(out Value: Single): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableSingle.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Single>(fValue);
end;
end;
procedure NullableSingle.Clear;
begin
SetNull;
@ -1475,6 +1736,25 @@ begin
end;
end;
function NullableDouble.TryHasValue(out Value: Double): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableDouble.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Double>(fValue);
end;
end;
procedure NullableDouble.Clear;
begin
SetNull;
@ -1565,6 +1845,25 @@ begin
end;
end;
function NullableExtended.TryHasValue(out Value: Extended): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableExtended.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Extended>(fValue);
end;
end;
procedure NullableExtended.Clear;
begin
SetNull;
@ -1655,6 +1954,25 @@ begin
end;
end;
function NullableInt16.TryHasValue(out Value: Int16): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableInt16.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Int16>(fValue);
end;
end;
procedure NullableInt16.Clear;
begin
SetNull;
@ -1744,6 +2062,25 @@ begin
end;
end;
function NullableUInt16.TryHasValue(out Value: UInt16): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableUInt16.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<UInt16>(fValue);
end;
end;
procedure NullableUInt16.Clear;
begin
SetNull;
@ -1833,6 +2170,25 @@ begin
end;
end;
function NullableInt32.TryHasValue(out Value: Int32): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableInt32.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Int32>(fValue);
end;
end;
procedure NullableInt32.Clear;
begin
SetNull;
@ -1922,6 +2278,25 @@ begin
end;
end;
function NullableUInt32.TryHasValue(out Value: UInt32): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableUInt32.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<UInt32>(fValue);
end;
end;
procedure NullableUInt32.Clear;
begin
SetNull;
@ -2011,6 +2386,25 @@ begin
end;
end;
function NullableInt64.TryHasValue(out Value: Int64): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableInt64.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<Int64>(fValue);
end;
end;
procedure NullableInt64.Clear;
begin
SetNull;
@ -2100,6 +2494,25 @@ begin
end;
end;
function NullableUInt64.TryHasValue(out Value: UInt64): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableUInt64.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<UInt64>(fValue);
end;
end;
procedure NullableUInt64.Clear;
begin
SetNull;
@ -2189,6 +2602,25 @@ begin
end;
end;
function NullableTGUID.TryHasValue(out Value: TGUID): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function NullableTGUID.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<TGUID>(fValue);
end;
end;
procedure NullableTGUID.Clear;
begin
SetNull;

View File

@ -32,7 +32,7 @@ unit MVCFramework.Nullables;
interface
uses
System.SysUtils, System.Classes, System.TypInfo;
System.SysUtils, System.Classes, System.TypInfo, System.RTTI;
type
EMVCNullable = class(Exception)
@ -79,6 +79,14 @@ type
/// </summary>
function Equals(const Value: Nullable$TYPE$): Boolean;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: $TYPE$): Boolean; overload;
///<summary>
///Returns true if the nullable contains a value and returns the contained value in the out Value parameter.
///</summary>
function TryHasValue(out Value: TValue): Boolean; overload;
///<summary>
///Returns the value stored or raises exception if no value is stored
///</summary>
property Value: $TYPE$ read GetValue write SetValue;
@ -103,6 +111,25 @@ begin
end;
end;
function Nullable$TYPE$.TryHasValue(out Value: $TYPE$): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := fValue;
end;
end;
function Nullable$TYPE$.TryHasValue(out Value: TValue): Boolean;
begin
Result := HasValue;
if Result then
begin
Value := TValue.From<$TYPE$>(fValue);
end;
end;
procedure Nullable$TYPE$.Clear;
begin
SetNull;

View File

@ -52,6 +52,8 @@ type
[Test]
procedure TestCRUD;
[Test]
procedure TestRefresh;
[Test]
procedure Test_ISSUE485;
[Test]
procedure TestDeleteIfNotFound;
@ -1488,8 +1490,7 @@ begin
CreateACustomer('New York 1', 'New York', 5);
CreateACustomer('Toyko 1', 'Tokyo', 4);
var
lRomeCustomer := TMVCActiveRecord.SelectOneByRQL<TRomeBasedCustomer>('contains(CompanyName,"1")');
var lRomeCustomer := TMVCActiveRecord.SelectOneByRQL<TRomeBasedCustomer>('contains(CompanyName,"1")');
try
Assert.IsNotNull(lRomeCustomer);
finally
@ -1513,6 +1514,48 @@ begin
end;
end;
procedure TTestActiveRecordBase.TestRefresh;
var
lCustomer: TCustomer;
lID: Integer;
begin
Assert.AreEqual(Int64(0), TMVCActiveRecord.Count<TCustomer>());
lCustomer := TCustomer.Create;
try
lCustomer.CompanyName := 'bit Time Professionals';
lCustomer.City := 'Rome, IT';
lCustomer.Note := 'note1';
lCustomer.CreationTime := Time;
lCustomer.CreationDate := Date;
lCustomer.ID := -1; { don't be fooled by the default! }
lCustomer.Insert;
lID := lCustomer.ID;
Assert.AreEqual(1, lID);
lCustomer.CompanyName.Clear;
lCustomer.City := '';
lCustomer.Note := '';
lCustomer.CreationTime := 0;
lCustomer.CreationDate := 0;
lCustomer.Refresh;
Assert.AreEqual('bit Time Professionals', lCustomer.CompanyName.ValueOrDefault);
Assert.AreEqual('Rome, IT', lCustomer.City);
Assert.AreEqual('note1', lCustomer.Note);
finally
lCustomer.Free;
end;
lCustomer := TCustomer.Create;
try
lCustomer.ID := lID;
lCustomer.Refresh;
Assert.AreEqual('bit Time Professionals', lCustomer.CompanyName.ValueOrDefault);
Assert.AreEqual('Rome, IT', lCustomer.City);
Assert.AreEqual('note1', lCustomer.Note);
finally
lCustomer.Free;
end;
end;
procedure TTestActiveRecordBase.TestRQL;
var
lCustomers: TObjectList<TCustomer>;

View File

@ -8,9 +8,11 @@ program DMVCFrameworkTests;
uses
System.SysUtils,
System.IOUtils,
DUnitX.TestFramework,
{$IFDEF CONSOLE_TESTRUNNER}
DUnitX.Loggers.Console,
DUnitX.Loggers.XML.NUnit,
{$ENDIF }
{$IFDEF TESTINSIGHT}
TestInsight.DUnitX,
@ -83,6 +85,7 @@ var
runner: ITestRunner;
results: IRunResults;
logger: ITestLogger;
OutputNUnitFolder: String;
begin
try
// Check command line options, will exit if invalid
@ -95,9 +98,25 @@ begin
// Log to the console window
logger := TDUnitXConsoleLogger.Create(True);
runner.AddLogger(logger);
// Generate an NUnit compatible XML File
// nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile);
// runner.AddLogger(nunitLogger);
if TDUnitX.Options.XMLOutputFile.IsEmpty then
begin
OutputNUnitFolder := TPath.Combine(
TDirectory.GetParent(TDirectory.GetParent(TDirectory.GetParent(AppPath))), 'UnitTestReports');
TDirectory.CreateDirectory(OutputNUnitFolder);
{$if defined(win32)}
TDUnitX.Options.XMLOutputFile := TPath.Combine(OutputNUnitFolder,'dmvcframework_nunit_win32.xml');
{$endif}
{$if defined(win64)}
TDUnitX.Options.XMLOutputFile := TPath.Combine(OutputNUnitFolder, 'dmvcframework_nunit_win64.xml');
{$endif}
{$if defined(linux64)}
TDUnitX.Options.XMLOutputFile := TPath.Combine(OutputNUnitFolder, 'dmvcframework_nunit_linux64.xml');
{$endif}
end;
runner.AddLogger(TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile));
runner.FailsOnNoAsserts := False; // When true, Assertions must be made during tests;
// Run tests

View File

@ -236,7 +236,6 @@
<DCCReference Include="StandaloneServerTestU.pas"/>
<DCCReference Include="webmodules\StandAloneServerWebModuleTest.pas">
<Form>TestWebModule2</Form>
<FormType>dfm</FormType>
<DesignClass>TWebModule</DesignClass>
</DCCReference>
<DCCReference Include="..\..\..\sources\MVCFramework.Commons.pas"/>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,997 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<test-results name="C:\DEV\dmvcframework\unittests\general\Several\bin64\DMVCFrameworkTests.exe" total="451" errors="0" failures="0" ignored="0" inconclusive="0" not-run="0" skipped="0" invalid="0" date="2023-01-29" time="32.528">
<culture-info current-culture="en" current-uiculture="en" />
<test-suite type="Assembly" name="DMVCFrameworkTests.exe" executed="true" result="Success" success="True" time="32.528" asserts="0">
<results>
<test-suite type="Namespace" name="StandaloneServerTestU" executed="true" result="Success" success="True" time="32.527" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestServerContainer" executed="True" result="Success" success="True" time="32.527" >
<results>
<test-case name="TestListener" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestListenerContext" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestServerListenerAndClient" executed="True" result="Success" success="True" time="0.035" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Namespace" name="ObjectPoolTestU" executed="true" result="Success" success="True" time="32.485" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestTObjectPool" executed="True" result="Success" success="True" time="32.485" >
<results>
<test-case name="TestFixedSize" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestGrowing" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestFactory" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestMultiThreading" executed="True" result="Success" success="True" time="1.010" asserts="0" />
<test-case name="TestRaiseExceptionWhenPoolIsEmpty" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestNotRaiseExceptionWhenPoolIsEmpty" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Namespace" name="Serializers" executed="true" result="Success" success="True" time="31.472" asserts="0" >
<results>
<test-suite type="Fixture" name="TMVCTestSerializerJsonDataObjects" executed="True" result="Success" success="True" time="31.472" >
<results>
<test-case name="TestSerializeAllTypes" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDateTimeProperty" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeAllNullableTypes" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestSerializeAllTypesInList" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestSerializeEntity" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestSerializeNil" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeEntityUpperCaseNames" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeEntityWithArray" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeEntityLowerCaseNames" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeEntityNameAs" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeEntityCustomSerializer" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeEntityCustomMemberSerializer" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeEntitySerializationType" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeCollection" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDataSet" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestDataSetHelpers" executed="True" result="Success" success="True" time="0.001" asserts="0" >
<categories>
<category name="datasets" />
</categories>
</test-case>
<test-case name="TestDeserializeEntity" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDeserializeEntityCustomSerializer" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDeserializeEntityCustomValueTypeSerializer" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDeserializeEntityCustomMemberSerializer" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDeserializeEntitySerializationType" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDeserializeCollection" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDeserializeDataSet" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestSerializeEmptyDataSet" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDeserializeEntityWithArray" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDeSerializeEntityWithEnums" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDeSerializeEntityWithSet" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestStringDictionary" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDeserializeGuid" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDeserializeEntityWithInterface" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDeserializeGenericEntity" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeDeserializeMultipleGenericEntity" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDoNotSerializeDoNotDeSerialize" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeListOfSomething" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestSerializeListWithNulls" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestSerializeListWithNulls2" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedProperty_WithPropertyUnassigned_JSONExists" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedProperty_WithPropertyAssigned_JSONExists" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedProperty_WithPropertyAssigned_JSONNull" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedProperty_WithPropertyAssigned_JSONNotExists" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedProperty_WithPropertyUnAssigned_JSONNull" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedProperty_WithFieldsUnassigned_JSONExists" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedField_WithFieldsAssigned_JSONNull" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
<test-case name="TestDeserializeOwnedProperty_WithPropertyUnassigned_JSONExists_Polimorphic" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="serializers" />
</categories>
</test-case>
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Fixture" name="TTestJWT" executed="True" result="Success" success="True" time="31.456" >
<results>
<test-case name="TestHMAC" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestStorage" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestCreateAndValidateToken" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestLoadToken" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestNotBefore" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestExpirationTime" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestIssuedAt" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestDefaults" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
<test-suite type="Fixture" name="TTestRouting" executed="True" result="Success" success="True" time="31.455" >
<results>
<test-case name="TestWithNoParameters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestWithNoPath" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestPathButNoParameters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestPathWithParameters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestWithMethodTypes" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestComplexRoutings" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="Test_ISSUE_338" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="issues" />
</categories>
</test-case>
<test-case name="Test_ISSUE_513_A" executed="True" result="Success" success="True" time="0.001" asserts="0" >
<categories>
<category name="issues" />
</categories>
</test-case>
<test-case name="Test_ISSUE_513_B" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="issues" />
</categories>
</test-case>
<test-case name="Test_ISSUE_513_C" executed="True" result="Success" success="True" time="0.001" asserts="0" >
<categories>
<category name="issues" />
</categories>
</test-case>
<test-case name="Test_ISSUE_492" executed="True" result="Success" success="True" time="0.001" asserts="0" >
<categories>
<category name="issues" />
</categories>
</test-case>
<test-case name="TestProduceRoutings" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestProduceRoutingsWithExplicitCharset" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestPathPrefix" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestReservedIPs" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
<test-suite type="Namespace" name="LiveServerTestU" executed="true" result="Success" success="True" time="31.443" asserts="0" >
<results>
<test-suite type="Fixture" name="TJSONRPCServerWithGETTest" executed="True" result="Success" success="True" time="31.443" >
<categories>
<category name="jsonrpc" />
</categories>
<results>
<test-case name="TestRequestWithoutParams" executed="True" result="Success" success="True" time="0.008" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestNotificationWithoutParams" executed="True" result="Success" success="True" time="0.028" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestNotificationWhichRaisesError" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestToNotFoundMethod" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_I_I_ret_I" executed="True" result="Success" success="True" time="0.005" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithNamedParams_I_I_ret_I" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_I_I_I_ret_O" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithNamedParams_I_I_I_ret_O" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithWrongNamedParams" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_S_I_ret_S" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NamedParams_S_I_ret_S" executed="True" result="Success" success="True" time="0.005" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_I_I_ret_A" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_DT_T_ret_DT" executed="True" result="Success" success="True" time="0.016" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithObjectParameters" executed="True" result="Success" success="True" time="0.015" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooks" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenMethodRaisesError" executed="True" result="Success" success="True" time="0.013" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenOnAfterCallHookRaisesError" executed="True" result="Success" success="True" time="0.015" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotif" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotifWhenOnBeforeRoutingHookRaisesError" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotifWhenOnBeforeCallHookRaisesError" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotifWhenOnAfterCallHookRaisesError" executed="True" result="Success" success="True" time="0.001" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenOnBeforeCallHookRaisesError" executed="True" result="Success" success="True" time="0.001" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenOnBeforeRoutingHookRaisesError" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NoParams_SingleRecordAsResult" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NoParams_SingleComplexRecordAsResult" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_Echo_SingleRecordAsResult" executed="True" result="Success" success="True" time="0.026" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_Echo_ComplexRecord" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_Echo_ComplexRecords" executed="True" result="Success" success="True" time="0.006" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NoParams_DynamicArrayOfRecordAsResult" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestEnum" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestInvalidEnum" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestSet" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestInvalidSet" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Fixture" name="TTestUTC" executed="True" result="Success" success="True" time="31.230" >
<results>
<test-case name="TestStringToDateTime_Local" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestStringToDateTime_in_DST_period" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestStringToDateTime_in_no_DST_period" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestStringToDateTime_NewYork" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestStringToDateTime_Mumbai" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
<test-suite type="Namespace" name="ActiveRecordTestsU" executed="true" result="Success" success="True" time="31.229" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestActiveRecordPostgreSQL" executed="True" result="Success" success="True" time="31.229" >
<results>
<test-case name="TestCRUD" executed="True" result="Success" success="True" time="0.012" asserts="0" />
<test-case name="TestRefresh" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="Test_ISSUE485" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestDeleteIfNotFound" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestUpdateIfNotFound" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestCRUDWithSpaces" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestCRUDWithGUID" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestCRUDWithTableChange" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestCRUDStringPK" executed="True" result="Success" success="True" time="0.008" asserts="0" />
<test-case name="TestSelectWithExceptions" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestStore" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestLifeCycle" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestRQL" executed="True" result="Success" success="True" time="0.760" asserts="0" />
<test-case name="TestRQLWithMVCNameAsAttribute" executed="True" result="Success" success="True" time="0.569" asserts="0" />
<test-case name="TestRQLWithBoolean" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestRQLWithDateTime" executed="True" result="Success" success="True" time="0.563" asserts="0" />
<test-case name="TestRQLWithGUID" executed="True" result="Success" success="True" time="0.564" asserts="0" />
<test-case name="TestRQLLimit" executed="True" result="Success" success="True" time="0.539" asserts="0" />
<test-case name="TestIssue424" executed="True" result="Success" success="True" time="0.580" asserts="0" />
<test-case name="TestMultiThreading" executed="True" result="Success" success="True" time="0.546" asserts="0" />
<test-case name="TestNullables" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestMergeWhenNewRecords" executed="True" result="Success" success="True" time="0.041" asserts="0" />
<test-case name="TestMergeWhenNewDeletedRecords" executed="True" result="Success" success="True" time="0.062" asserts="0" />
<test-case name="TestMergeWhenChangedRecords" executed="True" result="Success" success="True" time="0.031" asserts="0" />
<test-case name="TestMergeWhenMixedRecords" executed="True" result="Success" success="True" time="0.038" asserts="0" />
<test-case name="TestDefaultFilteringSelectByRQL" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestDefaultFilteringSelectOneByRQL" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestDefaultFilteringCount" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestDefaultFilteringCountByRQL" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestDefaultFilteringDeleteByRQL" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestDefaultFilteringDelete" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestDefaultFilteringGetByPK" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestPartitioningCRUD" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestPartitioningSelectByWhere" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPartitioningSelectByRQL" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestPartitioningSelectOneByRQL" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestPartitioningCount" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestPartitioningCountByRQL" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestPartitioningDeleteByRQL" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestPartitioningDelete" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestPartitioningGetByPK" executed="True" result="Success" success="True" time="0.004" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Namespace" name="JSONRPCTestsU" executed="true" result="Success" success="True" time="19.426" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestJSONRPC" executed="True" result="Success" success="True" time="19.426" >
<results>
<test-case name="TestRequestWithArrayParameters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestRequestWithNamedParameters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestRequestWithMixedParamaters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestRequestWithNoParameters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestRequestWithMalformedJSON" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestNotificationWithNoParameters" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestIssue595" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Fixture" name="TTestCryptUtils" executed="True" result="Success" success="True" time="19.424" >
<results>
<test-case name="TestPBKDF2_SHA1" executed="True" result="Success" success="True" time="0.017" asserts="0" />
<test-case name="TestPBKDF2_SHA256" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
<test-suite type="Namespace" name="IntfObjectPoolTestU" executed="true" result="Success" success="True" time="19.166" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestTIntfObjectPool" executed="True" result="Success" success="True" time="19.166" >
<results>
<test-case name="TestFixedSize" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestGrowing" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestFactory" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestMultiThreading" executed="True" result="Success" success="True" time="1.013" asserts="0" />
<test-case name="TestRaiseExceptionWhenPoolIsEmpty" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestNotRaiseExceptionWhenPoolIsEmpty" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Fixture" name="TJSONRPCServerTest" executed="True" result="Success" success="True" time="18.149" >
<categories>
<category name="jsonrpc" />
</categories>
<results>
<test-case name="TestRequestWithoutParams" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestNotificationWithoutParams" executed="True" result="Success" success="True" time="0.029" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestNotificationWhichRaisesError" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestToNotFoundMethod" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_I_I_ret_I" executed="True" result="Success" success="True" time="0.024" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithNamedParams_I_I_ret_I" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_I_I_I_ret_O" executed="True" result="Success" success="True" time="0.005" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithNamedParams_I_I_I_ret_O" executed="True" result="Success" success="True" time="0.006" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithWrongNamedParams" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_S_I_ret_S" executed="True" result="Success" success="True" time="0.006" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NamedParams_S_I_ret_S" executed="True" result="Success" success="True" time="0.005" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_I_I_ret_A" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithParams_DT_T_ret_DT" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequestWithObjectParameters" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooks" executed="True" result="Success" success="True" time="0.018" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenMethodRaisesError" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenOnAfterCallHookRaisesError" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotif" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotifWhenOnBeforeRoutingHookRaisesError" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotifWhenOnBeforeCallHookRaisesError" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksNotifWhenOnAfterCallHookRaisesError" executed="True" result="Success" success="True" time="0.027" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenOnBeforeCallHookRaisesError" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestHooksWhenOnBeforeRoutingHookRaisesError" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NoParams_SingleRecordAsResult" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NoParams_SingleComplexRecordAsResult" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_Echo_SingleRecordAsResult" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_Echo_ComplexRecord" executed="True" result="Success" success="True" time="0.005" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_Echo_ComplexRecords" executed="True" result="Success" success="True" time="0.006" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestRequest_NoParams_DynamicArrayOfRecordAsResult" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestEnum" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestInvalidEnum" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestSet" executed="True" result="Success" success="True" time="0.040" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
<test-case name="TestInvalidSet" executed="True" result="Success" success="True" time="0.015" asserts="0" >
<categories>
<category name="jsonrpc" />
</categories>
</test-case>
</results>
</test-suite>
<test-suite type="Namespace" name="ActiveRecordControllerTestU" executed="true" result="Success" success="True" time="17.887" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestActiveRecordController" executed="True" result="Success" success="True" time="17.887" >
<results>
<test-case name="TestGetAll" executed="True" result="Success" success="True" time="0.015" asserts="0" />
<test-case name="TestCRUD" executed="True" result="Success" success="True" time="0.031" asserts="0" />
<test-case name="TestDelete" executed="True" result="Success" success="True" time="0.011" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Namespace" name="MVCFramework" executed="true" result="Success" success="True" time="17.544" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestRESTClient" executed="True" result="Success" success="True" time="17.544" >
<results>
<test-case name="TestCreateAndDestroy" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestInformation" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestHelloWorld" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestGetUser" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestPostUser" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestPostUsers" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestGetUsers" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestUploadFile" executed="True" result="Success" success="True" time="0.141" asserts="0" />
<test-case name="TestBodyURLEncoded" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestRequestHooksProc" executed="True" result="Success" success="True" time="0.028" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Fixture" name="TTestActiveRecordFirebird" executed="True" result="Success" success="True" time="17.339" >
<results>
<test-case name="TestCRUD" executed="True" result="Success" success="True" time="0.009" asserts="0" />
<test-case name="TestRefresh" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="Test_ISSUE485" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestDeleteIfNotFound" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestUpdateIfNotFound" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestCRUDWithSpaces" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestCRUDWithGUID" executed="True" result="Success" success="True" time="0.008" asserts="0" />
<test-case name="TestCRUDWithTableChange" executed="True" result="Success" success="True" time="0.010" asserts="0" />
<test-case name="TestCRUDStringPK" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestSelectWithExceptions" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestStore" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestLifeCycle" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestRQL" executed="True" result="Success" success="True" time="0.786" asserts="0" />
<test-case name="TestRQLWithMVCNameAsAttribute" executed="True" result="Success" success="True" time="0.644" asserts="0" />
<test-case name="TestRQLWithBoolean" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestRQLWithDateTime" executed="True" result="Success" success="True" time="0.519" asserts="0" />
<test-case name="TestRQLWithGUID" executed="True" result="Success" success="True" time="0.602" asserts="0" />
<test-case name="TestRQLLimit" executed="True" result="Success" success="True" time="0.713" asserts="0" />
<test-case name="TestIssue424" executed="True" result="Success" success="True" time="0.625" asserts="0" />
<test-case name="TestMultiThreading" executed="True" result="Success" success="True" time="0.471" asserts="0" />
<test-case name="TestNullables" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestMergeWhenNewRecords" executed="True" result="Success" success="True" time="0.094" asserts="0" />
<test-case name="TestMergeWhenNewDeletedRecords" executed="True" result="Success" success="True" time="0.073" asserts="0" />
<test-case name="TestMergeWhenChangedRecords" executed="True" result="Success" success="True" time="0.074" asserts="0" />
<test-case name="TestMergeWhenMixedRecords" executed="True" result="Success" success="True" time="0.068" asserts="0" />
<test-case name="TestDefaultFilteringSelectByRQL" executed="True" result="Success" success="True" time="0.013" asserts="0" />
<test-case name="TestDefaultFilteringSelectOneByRQL" executed="True" result="Success" success="True" time="0.008" asserts="0" />
<test-case name="TestDefaultFilteringCount" executed="True" result="Success" success="True" time="0.010" asserts="0" />
<test-case name="TestDefaultFilteringCountByRQL" executed="True" result="Success" success="True" time="0.008" asserts="0" />
<test-case name="TestDefaultFilteringDeleteByRQL" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestDefaultFilteringDelete" executed="True" result="Success" success="True" time="0.010" asserts="0" />
<test-case name="TestDefaultFilteringGetByPK" executed="True" result="Success" success="True" time="0.011" asserts="0" />
<test-case name="TestPartitioningCRUD" executed="True" result="Success" success="True" time="0.009" asserts="0" />
<test-case name="TestPartitioningSelectByWhere" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestPartitioningSelectByRQL" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestPartitioningSelectOneByRQL" executed="True" result="Success" success="True" time="0.010" asserts="0" />
<test-case name="TestPartitioningCount" executed="True" result="Success" success="True" time="0.009" asserts="0" />
<test-case name="TestPartitioningCountByRQL" executed="True" result="Success" success="True" time="0.009" asserts="0" />
<test-case name="TestPartitioningDeleteByRQL" executed="True" result="Success" success="True" time="0.010" asserts="0" />
<test-case name="TestPartitioningDelete" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestPartitioningGetByPK" executed="True" result="Success" success="True" time="0.011" asserts="0" />
</results>
</test-suite>
<test-suite type="Fixture" name="TServerTest" executed="True" result="Success" success="True" time="11.973" >
<results>
<test-case name="TestControllerWithExceptionInCreate.request url /fault" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestControllerWithExceptionInCreate.request url /fault2" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/&quot;" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/action1&quot;" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/action2&quot;" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/api/v1&quot;" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/api/v1/action1&quot;" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/api/v1/action2&quot;" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/api/v2&quot;" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/api/v2/action1&quot;" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestMultiMVCPathOnControllerAndAction.url &quot;/api/v2/action2&quot;" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestReqWithParams" executed="True" result="Success" success="True" time="0.020" asserts="0" />
<test-case name="TestReqWithURLMappedParams.1" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestReqWithURLMappedParams.2" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestReqWithURLMappedParams.3" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestReqWithURLMappedParams.4" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestReqWithURLMappedParams.5" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestReqWithURLMappedParams.6" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestReqWithURLMappedParams.7" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestReqWithURLMappedParams.8" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPOSTWithParamsAndJSONBody" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPOSTWithObjectJSONBody" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestCustomerEcho" executed="True" result="Success" success="True" time="0.011" asserts="0" />
<test-case name="TestCustomerEchoWithRootNode" executed="True" result="Success" success="True" time="0.016" asserts="0" />
<test-case name="TestEchoWithAllVerbs" executed="True" result="Success" success="True" time="0.018" asserts="0" />
<test-case name="TestCustomerEchoBodyFor" executed="True" result="Success" success="True" time="0.012" asserts="0" />
<test-case name="TestPOSTWithoutContentType" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestXHTTPMethodOverride_POST_as_PUT" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPUTWithParamsAndJSONBody" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestCookies" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestSessionWithLogin" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestSession" executed="True" result="Success" success="True" time="0.009" asserts="0" />
<test-case name="TestInvalidateSession" executed="True" result="Success" success="True" time="0.040" asserts="0" />
<test-case name="TestAsynchRequestPOST" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestAsynchRequestPUT" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestAsynchRequestGET" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestAsynchRequestDELETE" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestEncodingRenderJSONValue" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestRenderWrappedList" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestObjectDictIgnoredFields" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestObjectDictIgnoredFieldsWithDataSets" executed="True" result="Success" success="True" time="0.021" asserts="0" />
<test-case name="TestRenderActionInCollections" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestRenderWrappedListWithCompression" executed="True" result="Success" success="True" time="0.029" asserts="0" />
<test-case name="TestRenderStreamAndFreeWithOwnerFalse" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestRenderStreamAndFreeWithOwnerTrue" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestObjectDict" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestGetImagePng" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestProducesConsumes01" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestProducesConsumes02" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestProducesConsumes03" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestProducesConsumesWithWrongAcceptHeader" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestExceptionInMVCAfterCreate" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestExceptionInMVCBeforeDestroy" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestActionFiltersOnBeforeAction" executed="True" result="Success" success="True" time="0.008" asserts="0" />
<test-case name="TestMiddlewareSpeedMiddleware" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestMiddlewareHandler" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPostAListOfObjects" executed="True" result="Success" success="True" time="0.164" asserts="0" />
<test-case name="TestBasicAuth01" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestEntityWithArrays" executed="True" result="Success" success="True" time="0.023" asserts="0" />
<test-case name="TestEntityWithEmptyArrays" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestEntityWithGUIDs" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestEntityWithGUIDsEcho" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestBasicAuth02" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestBasicAuth03" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestBasicAuth04" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestBasicAuth05" executed="True" result="Success" success="True" time="0.012" asserts="0" />
<test-case name="TestCustomAuthRequestWithoutLogin" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestCustomAuthRequestsWithValidLogin" executed="True" result="Success" success="True" time="0.030" asserts="0" />
<test-case name="TestCustomAuthRequestsWithValidLogin_HTML" executed="True" result="Success" success="True" time="0.010" asserts="0" />
<test-case name="TestCustomAuthWrongRequestBodies" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestCustomAuthLoginLogout" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestTypedString1" executed="True" result="Success" success="True" time="0.020" asserts="0" />
<test-case name="TestTypedInteger1" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestTypedInt641" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestTypedSingle1" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestTypedDouble1" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestTypedExtended1" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestTypedAll" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestTypedDateTimeTypes" executed="True" result="Success" success="True" time="0.046" asserts="0" >
<categories>
<category name="datetime" />
</categories>
</test-case>
<test-case name="TestTypedDateTimeTypes_UTC" executed="True" result="Success" success="True" time="0.006" asserts="0" >
<categories>
<category name="datetime" />
</categories>
</test-case>
<test-case name="TestTypedBooleans" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestTypedTGuid1" executed="True" result="Success" success="True" time="0.006" asserts="0" />
<test-case name="TestStringDictionary" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestWrongJSONBody" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestTypedIntegerWrongParam1" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestEMVCException1" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="renders" />
<category name="exceptions" />
</categories>
</test-case>
<test-case name="TestEMVCException2" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="renders" />
<category name="exceptions" />
</categories>
</test-case>
<test-case name="TestEMVCException3" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="renders" />
<category name="exceptions" />
</categories>
</test-case>
<test-case name="TestEMVCException4" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="renders" />
<category name="exceptions" />
</categories>
</test-case>
<test-case name="TestDeserializeNullablesWithValue" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestDeserializeNullablesWithNulls" executed="True" result="Success" success="True" time="0.017" asserts="0" />
<test-case name="TestSerializeAndDeserializeNullables" executed="True" result="Success" success="True" time="0.005" asserts="0" />
<test-case name="TestSerializeAndDeserializeNullables_ISSUE_362" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSerializeAndDeserializeNullables_Passing_Integers_InsteadOf_Floats" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestResponseCreated" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestResponseNoContent" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestResponseAccepted" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestDirectoryTraversal1" executed="True" result="Success" success="True" time="0.114" asserts="0" >
<categories>
<category name="staticfiles" />
</categories>
</test-case>
<test-case name="TestDirectoryTraversal2" executed="True" result="Success" success="True" time="0.141" asserts="0" >
<categories>
<category name="staticfiles" />
</categories>
</test-case>
<test-case name="TestDirectoryRedirect" executed="True" result="Success" success="True" time="0.004" asserts="0" >
<categories>
<category name="staticfiles" />
</categories>
</test-case>
<test-case name="TestFileWithFolderName" executed="True" result="Success" success="True" time="0.013" asserts="0" >
<categories>
<category name="staticfiles" />
</categories>
</test-case>
<test-case name="TestSPASupport" executed="True" result="Success" success="True" time="0.114" asserts="0" >
<categories>
<category name="staticfiles" />
</categories>
</test-case>
<test-case name="TestGetInject10" executed="True" result="Success" success="True" time="0.002" asserts="0" >
<categories>
<category name="Injected" />
</categories>
</test-case>
<test-case name="TestGetInject20" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="Injected" />
</categories>
</test-case>
<test-case name="TestPostInject30" executed="True" result="Success" success="True" time="0.026" asserts="0" >
<categories>
<category name="Injected" />
</categories>
</test-case>
<test-case name="TestPostInject40" executed="True" result="Success" success="True" time="0.029" asserts="0" >
<categories>
<category name="Injected" />
</categories>
</test-case>
<test-case name="TestPostInject50" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="Injected" />
</categories>
</test-case>
<test-case name="TestViewDataViewDataSet" executed="True" result="Success" success="True" time="0.007" asserts="0" />
<test-case name="TestIssue406" executed="True" result="Success" success="True" time="0.003" asserts="0" >
<categories>
<category name="renders" />
</categories>
</test-case>
<test-case name="TestIssue542" executed="True" result="Success" success="True" time="0.011" asserts="0" />
</results>
</test-suite>
<test-suite type="Fixture" name="TTestActiveRecordSQLite" executed="True" result="Success" success="True" time="10.724" >
<results>
<test-case name="TestCRUD" executed="True" result="Success" success="True" time="0.004" asserts="0" />
<test-case name="TestRefresh" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="Test_ISSUE485" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestDeleteIfNotFound" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestUpdateIfNotFound" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestCRUDWithSpaces" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestCRUDWithGUID" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestCRUDWithTableChange" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestCRUDStringPK" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestSelectWithExceptions" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestStore" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestLifeCycle" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestRQL" executed="True" result="Success" success="True" time="0.486" asserts="0" />
<test-case name="TestRQLWithMVCNameAsAttribute" executed="True" result="Success" success="True" time="0.458" asserts="0" />
<test-case name="TestRQLWithBoolean" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestRQLWithDateTime" executed="True" result="Success" success="True" time="0.577" asserts="0" />
<test-case name="TestRQLWithGUID" executed="True" result="Success" success="True" time="0.507" asserts="0" />
<test-case name="TestRQLLimit" executed="True" result="Success" success="True" time="0.608" asserts="0" />
<test-case name="TestIssue424" executed="True" result="Success" success="True" time="0.461" asserts="0" />
<test-case name="TestMultiThreading" executed="True" result="Success" success="True" time="0.570" asserts="0" />
<test-case name="TestNullables" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestMergeWhenNewRecords" executed="True" result="Success" success="True" time="0.015" asserts="0" />
<test-case name="TestMergeWhenNewDeletedRecords" executed="True" result="Success" success="True" time="0.055" asserts="0" />
<test-case name="TestMergeWhenChangedRecords" executed="True" result="Success" success="True" time="0.013" asserts="0" />
<test-case name="TestMergeWhenMixedRecords" executed="True" result="Success" success="True" time="0.033" asserts="0" />
<test-case name="TestDefaultFilteringSelectByRQL" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestDefaultFilteringSelectOneByRQL" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestDefaultFilteringCount" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestDefaultFilteringCountByRQL" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestDefaultFilteringDeleteByRQL" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestDefaultFilteringDelete" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestDefaultFilteringGetByPK" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestPartitioningCRUD" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPartitioningSelectByWhere" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestPartitioningSelectByRQL" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestPartitioningSelectOneByRQL" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestPartitioningCount" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPartitioningCountByRQL" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestPartitioningDeleteByRQL" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPartitioningDelete" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPartitioningGetByPK" executed="True" result="Success" success="True" time="0.001" asserts="0" />
</results>
</test-suite>
<test-suite type="Fixture" name="TTestLRUCache" executed="True" result="Success" success="True" time="6.797" >
<results>
<test-case name="TestPutGet" executed="True" result="Success" success="True" time="0.000" asserts="0" >
<categories>
<category name="lru" />
</categories>
</test-case>
<test-case name="TestPutGet_Check_No_AV" executed="True" result="Success" success="True" time="6.767" asserts="0" >
<categories>
<category name="lru" />
</categories>
</test-case>
</results>
</test-suite>
<test-suite type="Namespace" name="RESTAdapterTestsU" executed="true" result="Success" success="True" time="0.029" asserts="0" >
<results>
<test-suite type="Fixture" name="TTestRESTAdapter" executed="True" result="Success" success="True" time="0.029" >
<results>
<test-case name="TestGetPeople" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestGetPeopleAsynch" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestGetTonyStark" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestGetTonyStarkAsynch" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestPostPerson" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestGetPersonByID" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestHeadersApplicationJSON" executed="True" result="Success" success="True" time="0.001" asserts="0" />
<test-case name="TestHeadersTextPlain" executed="True" result="Success" success="True" time="0.002" asserts="0" />
<test-case name="TestApplicationJSONWithHeaderTextPlain" executed="True" result="Success" success="True" time="0.003" asserts="0" />
<test-case name="TestGetPersonInJSONArray" executed="True" result="Success" success="True" time="0.002" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
<test-suite type="Fixture" name="TTestNameCase" executed="True" result="Success" success="True" time="0.005" >
<results>
<test-case name="TestNameCase" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.LowerCase" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.LowerCaseWithUnderline" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UpperCase" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UpperCaseWithUnderline" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.PascalCase" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.CamelCase" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UPPERLower1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UPPERLower2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UPPERLower3" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UPPERLower4" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UPPERLowerWithNumber1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.UPPERLowerWithNumber2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithSpaces1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithSpaces2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithSpaces3" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithDots1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithDots2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithDots3" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithUnderlines" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.MultipleUnderlines" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumber1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumber02" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle3" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle4" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle5" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle6" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle7" executed="True" result="Success" success="True" time="0.000" asserts="0" />
<test-case name="TestSnakeCase.WithNumberInTheMiddle8" executed="True" result="Success" success="True" time="0.000" asserts="0" />
</results>
</test-suite>
</results>
</test-suite>
</test-results>