Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion source/nodejs/adaptivecards/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"src"
],
"scripts": {
"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --forceExit --runInBand --detectOpenHandles",
"test": "TZ=UTC cross-env NODE_OPTIONS=--experimental-vm-modules jest --forceExit --runInBand --detectOpenHandles",
"clean": "rimraf build lib dist",
"generate-css": "concurrently \"sass -I ../node_modules src/scss/adaptivecards-default.scss lib/adaptivecards.css\" \"sass -I ../node_modules src/scss/adaptivecards-carousel.scss lib/adaptivecards-carousel.css\"",
"build-source": "concurrently \"tsc\" \"npm:generate-css\"",
Expand Down
37 changes: 37 additions & 0 deletions source/nodejs/adaptivecards/src/__tests__/text-formatters.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
import { formatText } from "../text-formatters";


function isoDate(tz: string = ""): string {
return `2023-10-01T12:00:00${tz}`;
}

describe("Text Formatters", () => {
test("UTC formatter", () => {
const date = isoDate("Z");
const res = formatText("en-GB", `{{DATE(${date}, SHORT)}} {{TIME(${date})}}`);
expect(res).toBe("Sun, 1 Oct 2023 12:00");
});

describe("Timezone leading to date change", () => {
test("Negative date change", () => {
const date = isoDate("+13:00");
const res = formatText("en-GB", `{{DATE(${date}, SHORT)}} {{TIME(${date})}}`);
expect(res).toBe("Sat, 30 Sept 2023 23:00");
});


test("Positive date change", () => {
const date = isoDate("-13:00");
const res = formatText("en-GB", `{{DATE(${date}, SHORT)}} {{TIME(${date})}}`);
expect(res).toBe("Mon, 2 Oct 2023 1:00");
});
});

test("Date without timezone", () => {
const date = isoDate();
const res = formatText("en-GB", `{{DATE(${date}, SHORT)}} {{TIME(${date})}}`);
expect(res).toBe("Sun, 1 Oct 2023 12:00");
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

6000

});
4 changes: 2 additions & 2 deletions source/nodejs/adaptivecards/src/text-formatters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ class TimeFormatter extends AbstractTextFormatter {
export function formatText(lang: string | undefined, text: string | undefined): string | undefined {
const formatters: AbstractTextFormatter[] = [
new DateFormatter(
/\{{2}DATE\((\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|(?:(?:-|\+)\d{2}:\d{2})))(?:, ?(COMPACT|LONG|SHORT))?\)\}{2}/g
/\{{2}DATE\((\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|(?:(?:-|\+)\d{2}:\d{2}))?)(?:, ?(COMPACT|LONG|SHORT))?\)\}{2}/g
),
new TimeFormatter(
/\{{2}TIME\((\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|(?:(?:-|\+)\d{2}:\d{2})))\)\}{2}/g
/\{{2}TIME\((\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|(?:(?:-|\+)\d{2}:\d{2}))?)\)\}{2}/g
)
];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,7 @@ namespace AdaptiveCardsSharedModelUnitTest
SKIP_TEST_OUTSIDE_PACIFIC_TIME();
TextBlock blck;
// seoul
std::string testString = "{{TIME(2017-10-28T11:25:00+09:00)}}";
blck.SetText(testString);
Assert::AreEqual<std::string>("{{TIME(2017-10-28T11:25:00+09:00)}}", blck.GetText());
Assert::AreEqual<std::string>("{{TIME(2017-10-28T11:25:00+09:00)}}", blck.GetText());

DateTimePreparser preparser = blck.GetTextForDateParsing();
Assert::AreEqual<std::string>(preparser.GetTextTokens().front()->GetText(), "07:25 PM");
Expand All @@ -94,6 +92,19 @@ namespace AdaptiveCardsSharedModelUnitTest
DateTimePreparser preparser = blck.GetTextForDateParsing();
Assert::AreEqual<std::string>(preparser.GetTextTokens().front()->GetText(), "07:27 PM");
Assert::IsTrue(preparser.GetTextTokens().front()->GetFormat() == DateTimePreparsedTokenFormat::RegularString);
}
TEST_METHOD(TransformToTimeWithoutOffsetTest)
{
SKIP_TEST_OUTSIDE_PACIFIC_TIME();
TextBlock blck;
// New York
std::string testString = "{{TIME(2017-10-27T22:27)}}";
blck.SetText(testString);
Assert::AreEqual<std::string>("{{TIME(2017-10-27T22:27:00)}}", blck.GetText());

DateTimePreparser preparser = blck.GetTextForDateParsing();
Assert::AreEqual<std::string>(preparser.GetTextTokens().front()->GetText(), "10:27 PM");
Assert::IsTrue(preparser.GetTextTokens().front()->GetFormat() == DateTimePreparsedTokenFormat::RegularString);
}
};
TEST_CLASS(DateTest)
Expand Down Expand Up @@ -132,15 +143,31 @@ namespace AdaptiveCardsSharedModelUnitTest
{
SKIP_TEST_OUTSIDE_PACIFIC_TIME();
TextBlock blck;
std::string testString = "{{DATE(2017-10-28T11:25:00+09:00, COMPACT)}}";
std::string testString = "{{DATE(2023-10-01T12:00:00+13:00, COMPACT)}}";
// New York
blck.SetText(testString);
Assert::AreEqual<std::string>("{{DATE(2017-10-28T11:25:00+09:00, COMPACT)}}", blck.GetText());
Assert::AreEqual<std::string>("{{DATE(2023-10-01T12:00:00+13:00, COMPACT)}}", blck.GetText());

DateTimePreparser preparser = blck.GetTextForDateParsing();
std::shared_ptr<DateTimePreparsedToken> token(preparser.GetTextTokens().front());
Assert::AreEqual<std::string>(token->GetText(), "{{DATE(2017-10-28T11:25:00+09:00, COMPACT)}}");
Assert::IsTrue(token->GetDay() == 27 && token->GetMonth() == 9 && token->GetYear() == 2017);
Assert::AreEqual<std::string>(token->GetText(), "{{DATE(2017-10-28T12:00:00+13:00, COMPACT)}}");
Assert::IsTrue(token->GetDay() == 29 && token->GetMonth() == 8 && token->GetYear() == 2023);
Assert::IsTrue(token->GetFormat() == DateTimePreparsedTokenFormat::DateCompact);
}

TEST_METHOD(TransformToDateWithLargeNegativeOffset)
{
SKIP_TEST_OUTSIDE_PACIFIC_TIME();
TextBlock blck;
std::string testString = "{{DATE(2023-10-01T12:00:00-13:00, COMPACT)}}";
// New York
blck.SetText(testString);
Assert::AreEqual<std::string>("{{DATE(2023-10-01T12:00:00-13:00, COMPACT)}}", blck.GetText());

DateTimePreparser preparser = blck.GetTextForDateParsing();
std::shared_ptr<DateTimePreparsedToken> token(preparser.GetTextTokens().front());
Assert::AreEqual<std::string>(token->GetText(), "{{DATE(2023-10-01T12:00:00-13:00, COMPACT)}}");
Assert::IsTrue(token->GetDay() == 2 && token->GetMonth() == 9 && token->GetYear() == 2023);
Assert::IsTrue(token->GetFormat() == DateTimePreparsedTokenFormat::DateCompact);
}

Expand Down Expand Up @@ -183,6 +210,22 @@ namespace AdaptiveCardsSharedModelUnitTest
Assert::AreEqual<std::string>("{{DATE(2017-10-27T22:27:00-04:00, COMPACT)}}", blck.GetText());
}

TEST_METHOD(TransformToDateWithoutOffsetTest)
{
SKIP_TEST_OUTSIDE_PACIFIC_TIME();
TextBlock blck;
// New York
std::string testString = "{{DATE(2017-10-27T22:27, COMPACT)}}";
blck.SetText(testString);
Assert::AreEqual<std::string>("{{DATE(2017-10-27T22:27:00, COMPACT)}}", blck.GetText());

DateTimePreparser preparser = blck.GetTextForDateParsing();
std::shared_ptr<DateTimePreparsedToken> token(preparser.GetTextTokens().front());
Assert::AreEqual<std::string>(token->GetText(), "{{DATE(2017-10-27T22:27:00,COMPACT)}}");
Assert::IsTrue(token->GetDay() == 27 && token->GetMonth() == 9 && token->GetYear() == 2017);
Assert::IsTrue(token->GetFormat() == DateTimePreparsedTokenFormat::DateCompact);
}

};
TEST_CLASS(TimeAndDateInputTest)
{
Expand Down Expand Up @@ -423,6 +466,28 @@ namespace AdaptiveCardsSharedModelUnitTest
std::string testString = "{{DATE(1994-02-29T06:08:00Z)}}";
blck.SetText(testString);
Assert::AreEqual<std::string>("{{DATE(1994-02-29T06:08:00Z)}}", blck.GetText());
}
TEST_METHOD(PostiveOffsetLeadingToDateChange)
{
TextBlock blck;
std::string testString = "{{DATE(1994-02-29T12:00:00+13:00)}}";
blck.SetText(testString);
Assert::AreEqual<std::string>("{{DATE(1994-02-29T12:00:00+13:00)}}", blck.GetText());

DateTimePreparser preparser = blck.GetTextForDateParsing();
Assert::AreEqual<std::string>(preparser.GetTextTokens().front()->GetText(), "01:00 AM");
Assert::IsTrue(preparser.GetTextTokens().front()->GetFormat() == DateTimePreparsedTokenFormat::RegularString);
}
TEST_METHOD(NegativeOffsetLeadingToTimeChange)
{
TextBlock blck;
std::string testString = "{{TIME(1994-02-29T12:00:00+13:00)}}";
blck.SetText(testString);
Assert::AreEqual<std::string>("{{TIME(1994-02-29T12:00:00+13:00)}}", blck.GetText());

DateTimePreparser preparser = blck.GetTextForDateParsing();
Assert::AreEqual<std::string>(preparser.GetTextTokens().front()->GetText(), "01:00 AM");
Assert::IsTrue(preparser.GetTextTokens().front()->GetFormat() == DateTimePreparsedTokenFormat::RegularString);
}
};
}