Skip to content

Commit 15d891c

Browse files
committed
Refactor application of text decoration, text transform, letter spacing and formatted text.
Related to NativeScript#2427
1 parent 20c7284 commit 15d891c

File tree

20 files changed

+642
-199
lines changed

20 files changed

+642
-199
lines changed

apps/.vscode/launch.json

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
{
2+
"version": "0.2.0",
3+
"configurations": [
4+
{
5+
"name": "Launch on iOS Device",
6+
"type": "nativescript",
7+
"platform": "ios",
8+
"request": "launch",
9+
"appRoot": "${workspaceRoot}",
10+
"sourceMaps": true,
11+
"diagnosticLogging": false,
12+
"emulator": false
13+
},
14+
{
15+
"name": "Attach on iOS Device",
16+
"type": "nativescript",
17+
"platform": "ios",
18+
"request": "attach",
19+
"appRoot": "${workspaceRoot}",
20+
"sourceMaps": true,
21+
"diagnosticLogging": false,
22+
"emulator": false
23+
},
24+
{
25+
"name": "Launch on iOS Emulator",
26+
"type": "nativescript",
27+
"platform": "ios",
28+
"request": "launch",
29+
"appRoot": "${workspaceRoot}",
30+
"sourceMaps": true,
31+
"diagnosticLogging": false,
32+
"emulator": true
33+
},
34+
{
35+
"name": "Attach on iOS Emulator",
36+
"type": "nativescript",
37+
"platform": "ios",
38+
"request": "attach",
39+
"appRoot": "${workspaceRoot}",
40+
"sourceMaps": true,
41+
"diagnosticLogging": false,
42+
"emulator": true
43+
},
44+
{
45+
"name": "Launch on Android Device",
46+
"type": "nativescript",
47+
"platform": "android",
48+
"request": "launch",
49+
"appRoot": "${workspaceRoot}",
50+
"sourceMaps": true,
51+
"diagnosticLogging": false,
52+
"emulator": false
53+
},
54+
{
55+
"name": "Launch on Android Emulator",
56+
"type": "nativescript",
57+
"platform": "android",
58+
"request": "launch",
59+
"appRoot": "${workspaceRoot}",
60+
"sourceMaps": true,
61+
"diagnosticLogging": false,
62+
"emulator": true
63+
},
64+
{
65+
"name": "Attach on Android Device",
66+
"type": "nativescript",
67+
"platform": "android",
68+
"request": "attach",
69+
"appRoot": "${workspaceRoot}",
70+
"sourceMaps": true,
71+
"diagnosticLogging": false,
72+
"emulator": false
73+
},
74+
{
75+
"name": "Attach on Android Emulator",
76+
"type": "nativescript",
77+
"platform": "android",
78+
"request": "attach",
79+
"appRoot": "${workspaceRoot}",
80+
"sourceMaps": true,
81+
"diagnosticLogging": false,
82+
"emulator": true
83+
}
84+
]
85+
}

tests/app/ui/button/button-tests.ts

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,4 +300,68 @@ export var test_WhenFormattedTextPropertyChanges_TextIsUpdated_Button = function
300300
view.formattedText = null;
301301
TKUnit.assertEqual(view.text, "");
302302
});
303-
}
303+
}
304+
305+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithoutFormattedText_DoesNotCrash = function () {
306+
let view = new buttonModule.Button();
307+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
308+
TKUnit.assertEqual(view.text, "", "Text");
309+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
310+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
311+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
312+
313+
view.text = "NormalText";
314+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
315+
316+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
317+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
318+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
319+
});
320+
}
321+
322+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithFormattedText_DoesNotCrash = function () {
323+
let view = new buttonModule.Button();
324+
let formattedString = _generateFormattedString();
325+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
326+
TKUnit.assertEqual(view.text, "", "Text");
327+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
328+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
329+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
330+
331+
view.formattedText = formattedString;
332+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
333+
334+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
335+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
336+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
337+
});
338+
}
339+
340+
function _generateFormattedString(): formattedStringModule.FormattedString{
341+
let formattedString = new formattedStringModule.FormattedString();
342+
let span: spanModule.Span;
343+
344+
span = new spanModule.Span();
345+
span.fontFamily = "serif";
346+
span.fontSize = 10;
347+
span.fontAttributes = enums.FontAttributes.Bold;
348+
span.foregroundColor = new colorModule.Color("red");
349+
span.backgroundColor = new colorModule.Color("blue");
350+
span.underline = 0;
351+
span.strikethrough = 1;
352+
span.text = "Formatted";
353+
formattedString.spans.push(span);
354+
355+
span = new spanModule.Span();
356+
span.fontFamily = "sans-serif";
357+
span.fontSize = 20;
358+
span.fontAttributes = enums.FontAttributes.Italic;
359+
span.foregroundColor = new colorModule.Color("green");
360+
span.backgroundColor = new colorModule.Color("yellow");
361+
span.underline = 1;
362+
span.strikethrough = 0;
363+
span.text = "Text";
364+
formattedString.spans.push(span);
365+
366+
return formattedString;
367+
}

tests/app/ui/label/label-tests.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ import {isIOS} from "platform";
2222
import {Label} from "ui/label";
2323
import {LayoutBase} from "ui/layouts/layout-base";
2424
import * as helper from "../helper";
25+
import viewModule = require("ui/core/view");
26+
import formattedStringModule = require("text/formatted-string");
27+
import spanModule = require("text/span");
2528

2629
export class LabelTest extends testModule.UITest<LabelModule.Label> {
2730

@@ -596,3 +599,66 @@ export function createTestCase(): LabelTest {
596599
return new LabelTest();
597600
}
598601

602+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithoutFormattedText_DoesNotCrash = function () {
603+
let view = new LabelModule.Label();
604+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
605+
TKUnit.assertEqual(view.text, "", "Text");
606+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
607+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
608+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
609+
610+
view.text = "NormalText";
611+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
612+
613+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
614+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
615+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
616+
});
617+
}
618+
619+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithFormattedText_DoesNotCrash = function () {
620+
let view = new LabelModule.Label();
621+
let formattedString = _generateFormattedString();
622+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
623+
TKUnit.assertEqual(view.text, "", "Text");
624+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
625+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
626+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
627+
628+
view.formattedText = formattedString;
629+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
630+
631+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
632+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
633+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
634+
});
635+
}
636+
637+
function _generateFormattedString(): formattedStringModule.FormattedString{
638+
let formattedString = new formattedStringModule.FormattedString();
639+
let span: spanModule.Span;
640+
641+
span = new spanModule.Span();
642+
span.fontFamily = "serif";
643+
span.fontSize = 10;
644+
span.fontAttributes = enums.FontAttributes.Bold;
645+
span.foregroundColor = new colorModule.Color("red");
646+
span.backgroundColor = new colorModule.Color("blue");
647+
span.underline = 0;
648+
span.strikethrough = 1;
649+
span.text = "Formatted";
650+
formattedString.spans.push(span);
651+
652+
span = new spanModule.Span();
653+
span.fontFamily = "sans-serif";
654+
span.fontSize = 20;
655+
span.fontAttributes = enums.FontAttributes.Italic;
656+
span.foregroundColor = new colorModule.Color("green");
657+
span.backgroundColor = new colorModule.Color("yellow");
658+
span.underline = 1;
659+
span.strikethrough = 0;
660+
span.text = "Text";
661+
formattedString.spans.push(span);
662+
663+
return formattedString;
664+
}

tests/app/ui/text-field/text-field-tests.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,3 +535,67 @@ export var test_WhenFormattedTextPropertyChanges_TextIsUpdated_TextBase = functi
535535
TKUnit.assertEqual(view.text, "");
536536
});
537537
}
538+
539+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithoutFormattedText_DoesNotCrash = function () {
540+
let view = new textFieldModule.TextField();
541+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
542+
TKUnit.assertEqual(view.text, "", "Text");
543+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
544+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
545+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
546+
547+
view.text = "NormalText";
548+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
549+
550+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
551+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
552+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
553+
});
554+
}
555+
556+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithFormattedText_DoesNotCrash = function () {
557+
let view = new textFieldModule.TextField();
558+
let formattedString = _generateFormattedString();
559+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
560+
TKUnit.assertEqual(view.text, "", "Text");
561+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
562+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
563+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
564+
565+
view.formattedText = formattedString;
566+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
567+
568+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
569+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
570+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
571+
});
572+
}
573+
574+
function _generateFormattedString(): formattedStringModule.FormattedString{
575+
let formattedString = new formattedStringModule.FormattedString();
576+
let span: spanModule.Span;
577+
578+
span = new spanModule.Span();
579+
span.fontFamily = "serif";
580+
span.fontSize = 10;
581+
span.fontAttributes = enums.FontAttributes.Bold;
582+
span.foregroundColor = new colorModule.Color("red");
583+
span.backgroundColor = new colorModule.Color("blue");
584+
span.underline = 0;
585+
span.strikethrough = 1;
586+
span.text = "Formatted";
587+
formattedString.spans.push(span);
588+
589+
span = new spanModule.Span();
590+
span.fontFamily = "sans-serif";
591+
span.fontSize = 20;
592+
span.fontAttributes = enums.FontAttributes.Italic;
593+
span.foregroundColor = new colorModule.Color("green");
594+
span.backgroundColor = new colorModule.Color("yellow");
595+
span.underline = 1;
596+
span.strikethrough = 0;
597+
span.text = "Text";
598+
formattedString.spans.push(span);
599+
600+
return formattedString;
601+
}

tests/app/ui/text-view/text-view-tests.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import textViewTestsNative = require("./text-view-tests-native");
66
import colorModule = require("color");
77
import enums = require("ui/enums");
88
import platform = require("platform");
9+
import formattedStringModule = require("text/formatted-string");
10+
import spanModule = require("text/span");
911

1012
// >> require-textmodules
1113
import textViewModule = require("ui/text-view");
@@ -494,3 +496,67 @@ export function test_watch_listerer_is_removed_at_onDetach() {
494496
});
495497
}
496498
}
499+
500+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithoutFormattedText_DoesNotCrash = function () {
501+
let view = new textViewModule.TextView();
502+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
503+
TKUnit.assertEqual(view.text, "", "Text");
504+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
505+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
506+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
507+
508+
view.text = "NormalText";
509+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
510+
511+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
512+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
513+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
514+
});
515+
}
516+
517+
export var test_IntegrationTest_Transform_Decoration_Spacing_WithFormattedText_DoesNotCrash = function () {
518+
let view = new textViewModule.TextView();
519+
let formattedString = _generateFormattedString();
520+
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
521+
TKUnit.assertEqual(view.text, "", "Text");
522+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.none, "TextTransform");
523+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.none, "TextDecoration");
524+
TKUnit.assertTrue(isNaN(view.style.letterSpacing), "LetterSpacing");
525+
526+
view.formattedText = formattedString;
527+
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 10;");
528+
529+
TKUnit.assertEqual(view.style.textTransform, enums.TextTransform.uppercase, "TextTransform");
530+
TKUnit.assertEqual(view.style.textDecoration, enums.TextDecoration.underline, "TextDecoration");
531+
TKUnit.assertEqual(view.style.letterSpacing, 10, "LetterSpacing");
532+
});
533+
}
534+
535+
function _generateFormattedString(): formattedStringModule.FormattedString{
536+
let formattedString = new formattedStringModule.FormattedString();
537+
let span: spanModule.Span;
538+
539+
span = new spanModule.Span();
540+
span.fontFamily = "serif";
541+
span.fontSize = 10;
542+
span.fontAttributes = enums.FontAttributes.Bold;
543+
span.foregroundColor = new colorModule.Color("red");
544+
span.backgroundColor = new colorModule.Color("blue");
545+
span.underline = 0;
546+
span.strikethrough = 1;
547+
span.text = "Formatted";
548+
formattedString.spans.push(span);
549+
550+
span = new spanModule.Span();
551+
span.fontFamily = "sans-serif";
552+
span.fontSize = 20;
553+
span.fontAttributes = enums.FontAttributes.Italic;
554+
span.foregroundColor = new colorModule.Color("green");
555+
span.backgroundColor = new colorModule.Color("yellow");
556+
span.underline = 1;
557+
span.strikethrough = 0;
558+
span.text = "Text";
559+
formattedString.spans.push(span);
560+
561+
return formattedString;
562+
}

tns-core-modules/text/formatted-string-common.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,8 @@ export class FormattedString extends observable.Observable implements definition
234234
view.formattedText = value;
235235
}
236236
}
237+
238+
public _updateCharactersInRangeReplacementString(rangeLocation: number, rangeLength: number, replacementString: string): void {
239+
//
240+
}
237241
}

0 commit comments

Comments
 (0)