Data Types
This commit is contained in:
+114
-1
@@ -23,6 +23,12 @@ type
|
||||
|
||||
[Test]
|
||||
procedure TestTimestamps;
|
||||
|
||||
[Test]
|
||||
procedure TestEnums;
|
||||
|
||||
[Test]
|
||||
procedure TestAsString;
|
||||
end;
|
||||
|
||||
implementation
|
||||
@@ -253,7 +259,7 @@ begin
|
||||
Assert.AreEqual(dkTimestamp, tsType.Kind, 'Type kind should be dkTimestamp');
|
||||
|
||||
// --- 2. Test Value Creation and Access ---
|
||||
now := Now;
|
||||
now := System.Sysutils.Now;
|
||||
tsValue1 := TDataValue.FromTimestamp(now);
|
||||
|
||||
Assert.IsNotNull(tsValue1, 'TimestampValue should be created');
|
||||
@@ -277,6 +283,113 @@ begin
|
||||
);
|
||||
end;
|
||||
|
||||
procedure TMyTestObject.TestEnums;
|
||||
var
|
||||
colorType: IDataEnumType;
|
||||
red, green, blue: IDataEnumValue;
|
||||
begin
|
||||
// --- 1. Test Type Creation ---
|
||||
colorType := TDataType.EnumOf('Color', ['Red', 'Green', 'Blue']);
|
||||
|
||||
Assert.IsNotNull(colorType, 'EnumType should be created');
|
||||
Assert.AreEqual('Color', colorType.Name, 'Name should be Color');
|
||||
Assert.AreEqual(dkEnum, colorType.Kind, 'Kind should be dkEnum');
|
||||
Assert.AreEqual(3, colorType.IdentifierCount, 'IdentifierCount should be 3');
|
||||
Assert.AreEqual('Red', colorType.Identifiers[0], 'Identifier at index 0 should be Red');
|
||||
Assert.AreEqual('Green', colorType.Identifiers[1], 'Identifier at index 1 should be Green');
|
||||
Assert.AreEqual('Blue', colorType.Identifiers[2], 'Identifier at index 2 should be Blue');
|
||||
Assert.AreEqual(1, colorType.IndexOf('Green'), 'IndexOf Green should be 1');
|
||||
Assert.AreEqual(-1, colorType.IndexOf('Yellow'), 'IndexOf Yellow should be -1');
|
||||
|
||||
// --- 2. Test Value Creation and Access ---
|
||||
red := colorType.CreateValue(0);
|
||||
green := colorType.CreateValue('Green');
|
||||
blue := TDataValue(colorType.CreateValue(2)).AsEnum;
|
||||
|
||||
Assert.IsNotNull(red, 'EnumValue from index should be created');
|
||||
Assert.AreSame(colorType, red.DataType, 'Red should have the correct data type');
|
||||
Assert.AreEqual(0, red.Value, 'Value of Red should be 0');
|
||||
Assert.AreEqual('Red', red.AsString, 'AsText of Red should be Red');
|
||||
|
||||
Assert.IsNotNull(green, 'EnumValue from identifier should be created');
|
||||
Assert.AreSame(colorType, green.DataType, 'Green should have the correct data type');
|
||||
Assert.AreEqual(1, green.Value, 'Value of Green should be 1');
|
||||
Assert.AreEqual('Green', green.AsString, 'AsText of Green should be Green');
|
||||
|
||||
Assert.AreEqual(2, blue.Value, 'Value of Blue should be 2');
|
||||
|
||||
// --- 3. Test Validation and Error Handling ---
|
||||
// Test creating a type with duplicate identifiers
|
||||
Assert.WillRaise(
|
||||
procedure begin TDataType.EnumOf('Fails', ['A', 'B', 'A']); end,
|
||||
EArgumentException,
|
||||
'Duplicate identifiers should raise an exception'
|
||||
);
|
||||
|
||||
// Test creating a value with an invalid index
|
||||
Assert.WillRaise(procedure begin colorType.CreateValue(3); end, EArgumentException, 'Invalid index should raise an exception');
|
||||
Assert.WillRaise(procedure begin colorType.CreateValue(-1); end, EArgumentException, 'Negative index should raise an exception');
|
||||
|
||||
// Test creating a value with an unknown identifier
|
||||
Assert.WillRaise(
|
||||
procedure begin colorType.CreateValue('Yellow'); end,
|
||||
EArgumentException,
|
||||
'Unknown identifier should raise an exception'
|
||||
);
|
||||
end;
|
||||
|
||||
procedure TMyTestObject.TestAsString;
|
||||
var
|
||||
ordinalValue: IDataOrdinalValue;
|
||||
floatValue: IDataFloatValue;
|
||||
textValue: IDataTextValue;
|
||||
tsValue: IDataTimestampValue;
|
||||
enumValue: IDataEnumValue;
|
||||
arrayValue: IDataArrayValue;
|
||||
recordValue: IDataRecordValue;
|
||||
tupleValue: IDataTupleValue;
|
||||
colorType: IDataEnumType;
|
||||
personType: IDataRecordType;
|
||||
intArrayType: IDataArrayType;
|
||||
now: TDateTime;
|
||||
begin
|
||||
// Ordinal
|
||||
ordinalValue := TDataValue.FromOrdinal(123);
|
||||
Assert.AreEqual('123', ordinalValue.AsString, 'Ordinal AsString incorrect');
|
||||
|
||||
// Float
|
||||
floatValue := TDataValue.FromFloat(45.67);
|
||||
Assert.AreEqual(FloatToStr(45.67), floatValue.AsString, 'Float AsString incorrect');
|
||||
|
||||
// Text
|
||||
textValue := TDataValue.FromText('Hello');
|
||||
Assert.AreEqual('Hello', textValue.AsString, 'Text AsString incorrect');
|
||||
|
||||
// Timestamp
|
||||
now := System.Sysutils.Now;
|
||||
tsValue := TDataValue.FromTimestamp(now);
|
||||
Assert.AreEqual(DateTimeToStr(now), tsValue.AsString, 'Timestamp AsString incorrect');
|
||||
|
||||
// Enum
|
||||
colorType := TDataType.EnumOf('Color', ['Red', 'Green', 'Blue']);
|
||||
enumValue := colorType.CreateValue('Green');
|
||||
Assert.AreEqual('Green', enumValue.AsString, 'Enum AsString incorrect');
|
||||
|
||||
// Array
|
||||
intArrayType := TDataType.ArrayOfType(TDataType.Ordinal);
|
||||
arrayValue := intArrayType.CreateValue([TDataValue.FromOrdinal(1), TDataValue.FromOrdinal(2)]);
|
||||
Assert.AreEqual('[1, 2]', arrayValue.AsString, 'Array AsString incorrect');
|
||||
|
||||
// Record
|
||||
personType := TDataType.RecordOf([TRecordField.Create('ID', TDataType.Ordinal), TRecordField.Create('Name', TDataType.Text)]);
|
||||
recordValue := personType.CreateValue([TDataValue.FromOrdinal(1), TDataValue.FromText('Bob')]);
|
||||
Assert.AreEqual('<ID: 1, Name: Bob>', recordValue.AsString, 'Record AsString incorrect');
|
||||
|
||||
// Tuple
|
||||
tupleValue := TDataValue.FromTuple([TDataValue.FromOrdinal(10), TDataValue.FromText('Tuple')]);
|
||||
Assert.AreEqual('(10, Tuple)', tupleValue.AsString, 'Tuple AsString incorrect');
|
||||
end;
|
||||
|
||||
initialization
|
||||
TDUnitX.RegisterTestFixture(TMyTestObject);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user