TAChart: Add StartOfTheQuarter and IncQuarter functions (date/time-related). Add related unit tests.

This commit is contained in:
wp_xyz 2022-01-14 11:46:56 +01:00
parent 8e85780b9f
commit c5b1c18380
2 changed files with 133 additions and 1 deletions

View File

@ -347,6 +347,7 @@ function FormatIfNotEmpty(AFormat, AStr: String): String; inline;
function IfThen(ACond: Boolean; ATrue, AFalse: TObject): TObject; overload;
function ImgRoundChecked(A: Double): Integer; inline;
function IncQuarter(ADate: TDateTime; NumberOfQuarters: Integer): TDate;
function InterpolateRGB(AColor1, AColor2: Integer; ACoeff: Double): Integer;
function IntToColorHex(AColor: Integer): String; inline;
function IsEquivalent(const A1, A2: Double): Boolean; inline;
@ -366,6 +367,8 @@ procedure SetPropDefaults(AObject: TPersistent; APropNames: array of String);
function Split(
AString: String; ADest: TStrings = nil; ADelimiter: Char = '|'): TStrings;
function StartOfTheQuarter(ADate: TDateTime): TDate;
// Accept both locale-specific and default decimal separators.
function StrToFloatDefSep(const AStr: String; ADefault: Double = 0.0): Double;
// .. or date/time values
@ -494,6 +497,17 @@ begin
Result := Round(EnsureRange(A, -MAX_COORD, MAX_COORD));
end;
function IncQuarter(ADate: TDateTime; NumberOfQuarters: Integer): TDate;
var
y, m, d: Word;
begin
DecodeDate(ADate, y,m,d);
m := (((m - 1) div 3) + NumberOfQuarters) * 3;
inc(y, m div 12);
m := m mod 12 + 1;
Result := EncodeDate(y, m, 1);
end;
function InterpolateRGB(AColor1, AColor2: Integer; ACoeff: Double): Integer;
type
TBytes = packed array [1..4] of Byte;
@ -592,6 +606,15 @@ begin
Result.DelimitedText := AString;
end;
function StartOfTheQuarter(ADate: TDateTime): TDate;
var
y,m,d: Word;
begin
DecodeDate(ADate, y,m,d);
m := ((m - 1) div 3) * 3 + 1;
Result := EncodeDate(y, m, 1);
end;
function StrToFloatDefSep(const AStr: String; ADefault: Double = 0.0): Double;
begin
if

View File

@ -85,6 +85,13 @@ type
procedure TestFitEquationText;
end;
TQuarterTest = class(TTestCase)
published
procedure TestStartOfTheQuarter;
procedure TestIncQuarter;
end;
implementation
uses
@ -629,11 +636,113 @@ begin
end;
{ TQuarterTest }
procedure TQuarterTest.TestStartOfTheQuarter;
begin
AssertEquals(EncodeDate(2020, 1, 1), StartOfTheQuarter(EncodeDate(2020, 1, 1)));
AssertEquals(EncodeDate(2020, 1, 1), StartOfTheQuarter(EncodeDate(2020, 1, 31)));
AssertEquals(EncodeDate(2020, 1, 1), StartOfTheQuarter(EncodeDate(2020, 2, 1)));
AssertEquals(EncodeDate(2020, 1, 1), StartOfTheQuarter(EncodeDate(2020, 2, 29)));
AssertEquals(EncodeDate(2020, 1, 1), StartOfTheQuarter(EncodeDate(2020, 3, 1)));
AssertEquals(EncodeDate(2020, 4, 1), StartOfTheQuarter(EncodeDate(2020, 4, 1)));
AssertEquals(EncodeDate(2020, 4, 1), StartOfTheQuarter(EncodeDate(2020, 4, 30)));
AssertEquals(EncodeDate(2020, 4, 1), StartOfTheQuarter(EncodeDate(2020, 5, 15)));
AssertEquals(EncodeDate(2020, 4, 1), StartOfTheQuarter(EncodeDate(2020, 6, 15)));
AssertEquals(EncodeDate(2020, 7, 1), StartOfTheQuarter(EncodeDate(2020, 7, 15)));
AssertEquals(EncodeDate(2020, 7, 1), StartOfTheQuarter(EncodeDate(2020, 8, 15)));
AssertEquals(EncodeDate(2020, 7, 1), StartOfTheQuarter(EncodeDate(2020, 9, 15)));
AssertEquals(EncodeDate(2020, 10, 1), StartOfTheQuarter(EncodeDate(2020, 10, 1)));
AssertEquals(EncodeDate(2020, 10, 1), StartOfTheQuarter(EncodeDate(2020, 11, 5)));
AssertEquals(EncodeDate(2020, 10, 1), StartOfTheQuarter(EncodeDate(2020, 12, 6)));
AssertEquals(EncodeDate(2020, 10, 1), StartOfTheQuarter(EncodeDate(2020, 12, 31)));
AssertEquals(EncodeDate(2021, 1, 1), StartOfTheQuarter(EncodeDate(2021, 2, 28)));
end;
procedure TQuarterTest.TestIncQuarter;
begin
AssertEquals(EncodeDate(2020, 4, 1), IncQuarter(EncodeDate(2020, 1, 1), 1));
AssertEquals(EncodeDate(2020, 4, 1), IncQuarter(EncodeDate(2020, 1, 2), 1));
AssertEquals(EncodeDate(2020, 4, 1), IncQuarter(EncodeDate(2020, 2, 29), 1));
AssertEquals(EncodeDate(2020, 4, 1), IncQuarter(EncodeDate(2020, 3, 31), 1));
AssertEquals(EncodeDate(2020, 7, 1), IncQuarter(EncodeDate(2020, 4, 1), 1));
AssertEquals(EncodeDate(2020, 7, 1), IncQuarter(EncodeDate(2020, 5, 1), 1));
AssertEquals(EncodeDate(2020, 7, 1), IncQuarter(EncodeDate(2020, 6, 30), 1));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 7, 1), 1));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 8, 1), 1));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 9, 30), 1));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 10, 31), 1));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 11, 30), 1));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 12, 31), 1));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2021, 1, 10), 1));
AssertEquals(EncodeDate(2020, 7, 1), IncQuarter(EncodeDate(2020, 1, 1), 2));
AssertEquals(EncodeDate(2020, 7, 1), IncQuarter(EncodeDate(2020, 1, 2), 2));
AssertEquals(EncodeDate(2020, 7, 1), IncQuarter(EncodeDate(2020, 2, 29), 2));
AssertEquals(EncodeDate(2020, 7, 1), IncQuarter(EncodeDate(2020, 3, 31), 2));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 4, 1), 2));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 5, 1), 2));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 6, 30), 2));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 7, 1), 2));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 8, 1), 2));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 9, 30), 2));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 10, 31), 2));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 11, 30), 2));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 12, 31), 2));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2021, 1, 10), 2));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 1, 1), 3));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 1, 2), 3));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 2, 29), 3));
AssertEquals(EncodeDate(2020, 10, 1), IncQuarter(EncodeDate(2020, 3, 31), 3));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 4, 1), 3));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 5, 1), 3));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 6, 30), 3));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 7, 1), 3));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 8, 1), 3));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 9, 30), 3));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 10, 31), 3));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 11, 30), 3));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 12, 31), 3));
AssertEquals(EncodeDate(2021, 10, 1), IncQuarter(EncodeDate(2021, 1, 10), 3));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 1, 1), 4));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 1, 2), 4));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 2, 29), 4));
AssertEquals(EncodeDate(2021, 1, 1), IncQuarter(EncodeDate(2020, 3, 31), 4));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 4, 1), 4));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 5, 1), 4));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 6, 30), 4));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 7, 1), 4));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 8, 1), 4));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 9, 30), 4));
AssertEquals(EncodeDate(2021, 10, 1), IncQuarter(EncodeDate(2020, 10, 31), 4));
AssertEquals(EncodeDate(2021, 10, 1), IncQuarter(EncodeDate(2020, 11, 30), 4));
AssertEquals(EncodeDate(2021, 10, 1), IncQuarter(EncodeDate(2020, 12, 31), 4));
AssertEquals(EncodeDate(2022, 1, 1), IncQuarter(EncodeDate(2021, 1, 10), 4));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 1, 1), 5));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 1, 2), 5));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 2, 29), 5));
AssertEquals(EncodeDate(2021, 4, 1), IncQuarter(EncodeDate(2020, 3, 31), 5));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 4, 1), 5));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 5, 1), 5));
AssertEquals(EncodeDate(2021, 7, 1), IncQuarter(EncodeDate(2020, 6, 30), 5));
AssertEquals(EncodeDate(2021, 10, 1), IncQuarter(EncodeDate(2020, 7, 1), 5));
AssertEquals(EncodeDate(2021, 10, 1), IncQuarter(EncodeDate(2020, 8, 1), 5));
AssertEquals(EncodeDate(2021, 10, 1), IncQuarter(EncodeDate(2020, 9, 30), 5));
AssertEquals(EncodeDate(2022, 1, 1), IncQuarter(EncodeDate(2020, 10, 31), 5));
AssertEquals(EncodeDate(2022, 1, 1), IncQuarter(EncodeDate(2020, 11, 30), 5));
AssertEquals(EncodeDate(2022, 1, 1), IncQuarter(EncodeDate(2020, 12, 31), 5));
AssertEquals(EncodeDate(2022, 4, 1), IncQuarter(EncodeDate(2021, 1, 10), 5));
end;
initialization
RegisterTests([
TIntervalListTest, TMathTest, TGeometryTest, TColorTest, TRTTITest,
TPublishedIntegerSetTest, THistoryTest, TFitTest]);
TPublishedIntegerSetTest, THistoryTest, TFitTest, TQuarterTest]);
end.