Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
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");
});

Copy link
Copy Markdown

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);
}
};
}