Click next moves the focus to next focusable textfield (#5047)

* Click next moves the focus to next focusable textfield

Fixes https://github.com/NativeScript/NativeScript/issues/5033
When clicking next arrow on the virtual keyboard we were returning true which means we handled the event so the OS doesn't move the focus to the next item. This PR delete the `return true` when the action is `IME_ACTION_NEXT` so that next focusable item is automatically focued

* Fix IME_ACTION_PREVIOUS to raise returnPress event.
Added unit-test that IME_ACTION_PREVIOUS to raise returnPress event.
Refactored text-field-tests
This commit is contained in:
Hristo Hristov
2017-11-10 16:34:47 +02:00
committed by GitHub
parent 43fbabb5e9
commit 725475f860
2 changed files with 236 additions and 168 deletions

View File

@ -1,28 +1,32 @@
import * as TKUnit from "../../TKUnit";
import * as helper from "../helper";
import * as viewModule from "tns-core-modules/ui/core/view";
import * as pagesModule from "tns-core-modules/ui/page";
import * as textFieldTestsNative from "./text-field-tests-native";
import * as colorModule from "tns-core-modules/color";
import * as platform from "tns-core-modules/platform";
import * as formattedStringModule from "tns-core-modules/text/formatted-string";
import * as spanModule from "tns-core-modules/text/span";
import { View, isIOS } from "tns-core-modules/ui/core/view";
import { Page } from "tns-core-modules/ui/page";
import { StackLayout } from "tns-core-modules/ui/layouts/stack-layout";
import { Color } from "tns-core-modules/color";
import {
getNativeText, getNativeHint, typeTextNatively, getNativeSecure,
getNativeFontSize, getNativeColor, getNativeBackgroundColor,
getNativeTextAlignment, getNativePlaceholderColor
} from "./text-field-tests-native";
import { FormattedString } from "tns-core-modules/text/formatted-string";
import { Span } from "tns-core-modules/text/span";
// >> require-textfield
import * as textFieldModule from "tns-core-modules/ui/text-field";
import { TextField } from "tns-core-modules/ui/text-field";
// << require-textfield
// Other frequently used modules when working with buttons include:
import * as bindable from "tns-core-modules/ui/core/bindable";
import { BindingOptions } from "tns-core-modules/ui/core/bindable";
// >> require-observable-textfield
import * as observable from "tns-core-modules/data/observable";
import { Observable } from "tns-core-modules/data/observable";
// << require-observable-textfield
// ### Binding two TextFields text property to observable view-model property.
// >> binding-text-property-textfield
function pageLoaded(args) {
var page = args.object;
var obj = new observable.Observable();
var obj = new Observable();
obj.set("someProperty", "Please change this text!");
page.bindingContext = obj;
}
@ -33,144 +37,144 @@ export function test_recycling() {
helper.nativeView_recycling_test(_createTextFieldFunc);
}
var _createTextFieldFunc = function (): textFieldModule.TextField {
var _createTextFieldFunc = function (): TextField {
// >> creating-textfield
var textField = new textFieldModule.TextField();
var textField = new TextField();
// << creating-textfield
textField.text = "textField";
return textField;
}
export var testSetText = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
// >> setting-text-property
textField.text = "Hello, world!";
// << setting-text-property
var expectedValue = "Hello, world!";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
export var testSetTextNull = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.text = null;
var expectedValue = "";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
export var testSetTextUndefined = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.text = undefined;
var expectedValue = "";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
export var testSetTextToZero = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
(<any>textField).text = 0;
var expectedValue = "0";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
function createFormattedString(value: any): formattedStringModule.FormattedString {
var span = new spanModule.Span();
function createFormattedString(value: any): FormattedString {
var span = new Span();
span.text = value;
var result = new formattedStringModule.FormattedString();
var result = new FormattedString();
result.spans.push(span);
return result;
}
export var testSetTextWithSpan = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.formattedText = createFormattedString("Hello, world!");
var expectedValue = "Hello, world!";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
export var testSetTextNullWithSpan = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.formattedText = createFormattedString(null);
var expectedValue = "";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
export var testSetTextUndefinedWithSpan = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.formattedText = createFormattedString(undefined);
var expectedValue = "";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
export var testSetTextToZeroWithSpan = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.formattedText = createFormattedString(0);
var expectedValue = "0";
var actualValue = textFieldTestsNative.getNativeText(textField);
var actualValue = getNativeText(textField);
TKUnit.assertEqual(actualValue, expectedValue, "TextField native text");
});
}
/* tslint:disable */
export var testSetHintToNumber = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var expectedValue = 1;
// >> setting-hint-property
textField.hint = <any>expectedValue;
// << setting-hint-property
var actualValue = textFieldTestsNative.getNativeHint(textField);
var actualValue = getNativeHint(textField);
TKUnit.assert(<any>actualValue == expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
/* tslint:enable */
export var testBindTextDirectlyToModel = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
// >> binding-text-property-second
var model = new observable.Observable();
var model = new Observable();
model.set("username", "john");
var options: bindable.BindingOptions = {
var options: BindingOptions = {
sourceProperty: "username",
targetProperty: "text"
}
@ -178,60 +182,60 @@ export var testBindTextDirectlyToModel = function () {
// textField.text is now "john"
// >> (hide)
TKUnit.assert(textField.text === "john", "Actual: " + textField.text + "; Expected: " + "john");
TKUnit.assert(textFieldTestsNative.getNativeText(textField) === "john", "Actual: " + textFieldTestsNative.getNativeText(textField) + "; Expected: " + "john");
TKUnit.assert(getNativeText(textField) === "john", "Actual: " + getNativeText(textField) + "; Expected: " + "john");
// << (hide)
model.set("username", "mary");
// textField.text is now "mary"
// >> (hide)
TKUnit.assert(textField.text === "mary", "Actual: " + textField.text + "; Expected: " + "mary");
TKUnit.assert(textFieldTestsNative.getNativeText(textField) === "mary", "Actual: " + textFieldTestsNative.getNativeText(textField) + "; Expected: " + "mary");
TKUnit.assert(getNativeText(textField) === "mary", "Actual: " + getNativeText(textField) + "; Expected: " + "mary");
// << (hide)
// << binding-text-property-second
});
}
// Supported for ios only.
if (platform.device.os === platform.platformNames.ios) {
if (isIOS) {
exports.test_set_color = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
textField.color = new colorModule.Color("red");
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.color = new Color("red");
TKUnit.assertEqual(textField.color.ios.CGColor, textField.ios.textColor.CGColor, "textField.color");
});
}
}
export var testBindTextToBindingContext = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
var model = new observable.Observable();
var model = new Observable();
model.set("username", "john");
page.bindingContext = model;
var options: bindable.BindingOptions = {
var options: BindingOptions = {
sourceProperty: "username",
targetProperty: "text"
}
textField.bind(options);
TKUnit.assert(textField.text === "john", "Actual: " + textField.text + "; Expected: " + "john");
TKUnit.assert(textFieldTestsNative.getNativeText(textField) === "john", "Actual: " + textFieldTestsNative.getNativeText(textField) + "; Expected: " + "john");
TKUnit.assert(getNativeText(textField) === "john", "Actual: " + getNativeText(textField) + "; Expected: " + "john");
model.set("username", "mary");
TKUnit.assert(textField.text === "mary", "Actual: " + textField.text + "; Expected: " + "mary");
TKUnit.assert(textFieldTestsNative.getNativeText(textField) === "mary", "Actual: " + textFieldTestsNative.getNativeText(textField) + "; Expected: " + "mary");
TKUnit.assert(getNativeText(textField) === "mary", "Actual: " + getNativeText(textField) + "; Expected: " + "mary");
});
}
export var testTextIsUpdatedWhenUserTypes = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.updateTextTrigger = "focusLost";
var expectedValue = "Hello, world!";
textFieldTestsNative.typeTextNatively(textField, expectedValue);
typeTextNatively(textField, expectedValue);
var actualValue = textField.text;
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
@ -239,27 +243,27 @@ export var testTextIsUpdatedWhenUserTypes = function () {
}
export var testSetHint = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
// >> setting-hint-text
textField.hint = "type your username here";
// << setting-hint-text
var expectedValue = "type your username here";
var actualValue = textFieldTestsNative.getNativeHint(textField);
var actualValue = getNativeHint(textField);
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testBindHintDirectlyToModel = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
// >> binding-hint-property-textfield
var model = new observable.Observable();
var model = new Observable();
model.set("hint", "type your username here");
var options: bindable.BindingOptions = {
var options: BindingOptions = {
sourceProperty: "hint",
targetProperty: "hint"
}
@ -267,90 +271,90 @@ export var testBindHintDirectlyToModel = function () {
// textField.hint is now "type your username here"
// >> (hide)
TKUnit.assert(textField.hint === "type your username here", "Actual: " + textField.text + "; Expected: " + "type your username here");
TKUnit.assert(textFieldTestsNative.getNativeHint(textField) === "type your username here", "Actual: " + textFieldTestsNative.getNativeHint(textField) + "; Expected: " + "type your username here");
TKUnit.assert(getNativeHint(textField) === "type your username here", "Actual: " + getNativeHint(textField) + "; Expected: " + "type your username here");
// << (hide)
model.set("hint", "type your password here");
// textField.hint is now "type your password here"
// >> (hide)
TKUnit.assert(textField.hint === "type your password here", "Actual: " + textField.text + "; Expected: " + "type your password here");
TKUnit.assert(textFieldTestsNative.getNativeHint(textField) === "type your password here", "Actual: " + textFieldTestsNative.getNativeHint(textField) + "; Expected: " + "type your password here");
TKUnit.assert(getNativeHint(textField) === "type your password here", "Actual: " + getNativeHint(textField) + "; Expected: " + "type your password here");
// << (hide)
// << binding-hint-property-textfield
});
}
export var testBindHintToBindingConext = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
var model = new observable.Observable();
var model = new Observable();
model.set("hint", "type your username here");
page.bindingContext = model;
var options: bindable.BindingOptions = {
var options: BindingOptions = {
sourceProperty: "hint",
targetProperty: "hint"
}
textField.bind(options);
TKUnit.assert(textField.hint === "type your username here", "Actual: " + textField.hint + "; Expected: " + "type your username here");
TKUnit.assert(textFieldTestsNative.getNativeHint(textField) === "type your username here", "Actual: " + textFieldTestsNative.getNativeHint(textField) + "; Expected: " + "type your username here");
TKUnit.assert(getNativeHint(textField) === "type your username here", "Actual: " + getNativeHint(textField) + "; Expected: " + "type your username here");
model.set("hint", "type your password here");
TKUnit.assert(textField.hint === "type your password here", "Actual: " + textField.text + "; Expected: " + "type your password here");
TKUnit.assert(textFieldTestsNative.getNativeHint(textField) === "type your password here", "Actual: " + textFieldTestsNative.getNativeHint(textField) + "; Expected: " + "type your password here");
TKUnit.assert(getNativeHint(textField) === "type your password here", "Actual: " + getNativeHint(textField) + "; Expected: " + "type your password here");
});
}
export var testSetSecure = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
// >> setting-secure-property
textField.secure = true;
// << setting-secure-property
var expectedValue = true;
var actualValue = textFieldTestsNative.getNativeSecure(textField);
var actualValue = getNativeSecure(textField);
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testSetSecureAndKeyboardTypeNumber = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.secure = true;
textField.keyboardType = "number";
var expectedValue = true;
var actualValue = textFieldTestsNative.getNativeSecure(textField);
var actualValue = getNativeSecure(textField);
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testSetKeyboardTypeNumberAndSecure = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.keyboardType = "number";
textField.secure = true;
var expectedValue = true;
var actualValue = textFieldTestsNative.getNativeSecure(textField);
var actualValue = getNativeSecure(textField);
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
export var testBindSecureDirectlyToModel = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
// >> binding-secure-property
var model = new observable.Observable();
var model = new Observable();
model.set("secure", true);
var options: bindable.BindingOptions = {
var options: BindingOptions = {
sourceProperty: "secure",
targetProperty: "secure"
}
@ -358,47 +362,47 @@ export var testBindSecureDirectlyToModel = function () {
// textField.secure is now true
// >> (hide)
TKUnit.assert(textField.secure === true, "Actual: " + textField.secure + "; Expected: " + true);
TKUnit.assert(textFieldTestsNative.getNativeSecure(textField) === true, "Actual: " + textFieldTestsNative.getNativeSecure(textField) + "; Expected: " + true);
TKUnit.assert(getNativeSecure(textField) === true, "Actual: " + getNativeSecure(textField) + "; Expected: " + true);
// << (hide)
model.set("secure", false);
// textField.secure is now false
// >> (hide)
TKUnit.assert(textField.secure === false, "Actual: " + textField.secure + "; Expected: " + false);
TKUnit.assert(textFieldTestsNative.getNativeSecure(textField) === false, "Actual: " + textFieldTestsNative.getNativeSecure(textField) + "; Expected: " + false);
TKUnit.assert(getNativeSecure(textField) === false, "Actual: " + getNativeSecure(textField) + "; Expected: " + false);
// << (hide)
// << binding-secure-property
});
}
export var testBindSecureToBindingConext = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
var model = new observable.Observable();
var model = new Observable();
model.set("secure", true);
page.bindingContext = model;
var options: bindable.BindingOptions = {
var options: BindingOptions = {
sourceProperty: "secure",
targetProperty: "secure"
}
textField.bind(options);
TKUnit.assert(textField.secure === true, "Actual: " + textField.secure + "; Expected: " + true);
TKUnit.assert(textFieldTestsNative.getNativeSecure(textField) === true, "Actual: " + textFieldTestsNative.getNativeSecure(textField) + "; Expected: " + true);
TKUnit.assert(getNativeSecure(textField) === true, "Actual: " + getNativeSecure(textField) + "; Expected: " + true);
model.set("secure", false);
TKUnit.assert(textField.secure === false, "Actual: " + textField.secure + "; Expected: " + false);
TKUnit.assert(textFieldTestsNative.getNativeSecure(textField) === false, "Actual: " + textFieldTestsNative.getNativeSecure(textField) + "; Expected: " + false);
TKUnit.assert(getNativeSecure(textField) === false, "Actual: " + getNativeSecure(textField) + "; Expected: " + false);
});
}
var expectedFontSize = 42;
export var testLocalFontSizeFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { font-size: " + expectedFontSize + "; }";
var actualResult = textField.style.fontSize;
@ -407,22 +411,22 @@ export var testLocalFontSizeFromCss = function () {
}
export var testNativeFontSizeFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { font-size: " + expectedFontSize + "; }";
var actualResult = textFieldTestsNative.getNativeFontSize(textField);
var actualResult = getNativeFontSize(textField);
helper.assertAreClose(actualResult, expectedFontSize, "FontSizeFromCss");
});
}
export var testNativeFontSizeFromLocal = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.style.fontSize = expectedFontSize;
var actualResult = textFieldTestsNative.getNativeFontSize(textField);
var actualResult = getNativeFontSize(textField);
helper.assertAreClose(actualResult, expectedFontSize, "FontSizeFromLocal");
});
}
@ -430,9 +434,9 @@ export var testNativeFontSizeFromLocal = function () {
var expectedColorHex = "#FFFF0000";
var expectedNormalizedColorHex = "#FF0000";
export var testLocalColorFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { color: " + expectedColorHex + "; }";
var actualResult = textField.style.color.hex;
@ -441,22 +445,22 @@ export var testLocalColorFromCss = function () {
}
export var testNativeColorFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { color: " + expectedColorHex + "; }";
var actualResult = textFieldTestsNative.getNativeColor(textField).hex;
var actualResult = getNativeColor(textField).hex;
TKUnit.assert(actualResult === expectedNormalizedColorHex, "Actual: " + actualResult + "; Expected: " + expectedNormalizedColorHex);
});
}
export var testNativeColorFromLocal = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
textField.style.color = new colorModule.Color(expectedColorHex);
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.style.color = new Color(expectedColorHex);
var actualResult = textFieldTestsNative.getNativeColor(textField).hex;
var actualResult = getNativeColor(textField).hex;
TKUnit.assert(actualResult === expectedNormalizedColorHex, "Actual: " + actualResult + "; Expected: " + expectedNormalizedColorHex);
});
}
@ -464,9 +468,9 @@ export var testNativeColorFromLocal = function () {
var expectedBackgroundColorHex = "#FF00FF00";
var expectedNormalizedBackgroundColorHex = "#00FF00";
export var testLocalBackgroundColorFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { background-color: " + expectedBackgroundColorHex + "; }";
var actualResult = textField.style.backgroundColor.hex;
@ -475,35 +479,35 @@ export var testLocalBackgroundColorFromCss = function () {
}
export var testNativeBackgroundColorFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { background-color: " + expectedBackgroundColorHex + "; }";
helper.waitUntilLayoutReady(textField);
var actualResult = textFieldTestsNative.getNativeBackgroundColor(textField).hex;
var actualResult = getNativeBackgroundColor(textField).hex;
TKUnit.assert(actualResult === expectedNormalizedBackgroundColorHex, "Actual: " + actualResult + "; Expected: " + expectedNormalizedBackgroundColorHex);
});
}
export var testNativeBackgroundColorFromLocal = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var textField = <textFieldModule.TextField>views[0];
textField.style.backgroundColor = new colorModule.Color(expectedBackgroundColorHex);
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var textField = <TextField>views[0];
textField.style.backgroundColor = new Color(expectedBackgroundColorHex);
helper.waitUntilLayoutReady(textField);
var actualResult = textFieldTestsNative.getNativeBackgroundColor(textField).hex;
var actualResult = getNativeBackgroundColor(textField).hex;
TKUnit.assert(actualResult === expectedNormalizedBackgroundColorHex, "Actual: " + actualResult + "; Expected: " + expectedNormalizedBackgroundColorHex);
});
}
var expectedTextAlignment: "right" = "right";
export var testLocalTextAlignmentFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var view = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var view = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { text-align: " + expectedTextAlignment + "; }";
var actualResult = view.style.textAlignment;
@ -512,50 +516,50 @@ export var testLocalTextAlignmentFromCss = function () {
}
export var testNativeTextAlignmentFromCss = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var view = <textFieldModule.TextField>views[0];
var page = <pagesModule.Page>views[1];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var view = <TextField>views[0];
var page = <Page>views[1];
page.css = "textfield { text-align: " + expectedTextAlignment + "; }";
var actualResult = textFieldTestsNative.getNativeTextAlignment(view);
var actualResult = getNativeTextAlignment(view);
TKUnit.assert(actualResult === expectedTextAlignment, "Actual: " + actualResult + "; Expected: " + expectedTextAlignment);
});
}
export var testNativeTextAlignmentFromLocal = function () {
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<viewModule.View>) {
var view = <textFieldModule.TextField>views[0];
helper.buildUIAndRunTest(_createTextFieldFunc(), function (views: Array<View>) {
var view = <TextField>views[0];
view.style.textAlignment = expectedTextAlignment;
var actualResult = textFieldTestsNative.getNativeTextAlignment(view);
var actualResult = getNativeTextAlignment(view);
TKUnit.assert(actualResult === expectedTextAlignment, "Actual: " + actualResult + "; Expected: " + expectedTextAlignment);
});
}
export var testMemoryLeak = function (done) {
helper.buildUIWithWeakRefAndInteract(_createTextFieldFunc, function (textField) {
textFieldTestsNative.typeTextNatively(textField, "Hello, world!");
typeTextNatively(textField, "Hello, world!");
}, done);
}
export var test_WhenFormattedTextPropertyChanges_TextIsUpdated_TextBase = function () {
var firstSpan = new spanModule.Span();
var firstSpan = new Span();
firstSpan.fontSize = 10;
firstSpan.text = "First";
var secondSpan = new spanModule.Span();
var secondSpan = new Span();
secondSpan.fontSize = 15;
secondSpan.text = "Second";
var thirdSpan = new spanModule.Span();
var thirdSpan = new Span();
thirdSpan.fontSize = 20;
thirdSpan.text = "Third";
var formattedString1 = new formattedStringModule.FormattedString();
var formattedString1 = new FormattedString();
formattedString1.spans.push(firstSpan);
var formattedString2 = new formattedStringModule.FormattedString();
var formattedString2 = new FormattedString();
formattedString2.spans.push(secondSpan);
formattedString2.spans.push(thirdSpan);
var view = new textFieldModule.TextField();
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
var view = new TextField();
helper.buildUIAndRunTest(view, function (views: Array<View>) {
TKUnit.assertEqual(view.text, "");
view.formattedText = formattedString1;
@ -573,8 +577,8 @@ export var test_WhenFormattedTextPropertyChanges_TextIsUpdated_TextBase = functi
}
export function test_IntegrationTest_Transform_Decoration_Spacing_WithoutFormattedText_DoesNotCrash() {
let view = new textFieldModule.TextField();
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
const view = new TextField();
helper.buildUIAndRunTest(view, function (views: Array<View>) {
TKUnit.assertEqual(view.text, "", "Text");
TKUnit.assertEqual(view.style.textTransform, "initial", "TextTransform default value");
TKUnit.assertEqual(view.style.textDecoration, "none", "TextDecoration default value");
@ -590,9 +594,9 @@ export function test_IntegrationTest_Transform_Decoration_Spacing_WithoutFormatt
}
export function test_IntegrationTest_Transform_Decoration_Spacing_WithFormattedText_DoesNotCrash() {
let view = new textFieldModule.TextField();
let formattedString = helper._generateFormattedString();
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
const view = new TextField();
const formattedString = helper._generateFormattedString();
helper.buildUIAndRunTest(view, function (views: Array<View>) {
view.formattedText = formattedString;
view.setInlineStyle("text-transform: uppercase; text-decoration: underline; letter-spacing: 1;");
@ -603,24 +607,88 @@ export function test_IntegrationTest_Transform_Decoration_Spacing_WithFormattedT
}
export function test_set_placeholder_color() {
let view = new textFieldModule.TextField();
let expectedColorHex = "#FFFF0000";
let expectedNormalizedColorHex = "#FF0000";
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
const view = new TextField();
const expectedColorHex = "#FFFF0000";
const expectedNormalizedColorHex = "#FF0000";
helper.buildUIAndRunTest(view, function (views: Array<View>) {
view.hint = "Some text for hint";
view.setInlineStyle("placeholder-color: " + expectedColorHex + ";");
let actualColorHex = textFieldTestsNative.getNativePlaceholderColor(view).hex;
const actualColorHex = getNativePlaceholderColor(view).hex;
TKUnit.assertEqual(actualColorHex, expectedNormalizedColorHex);
});
}
export function test_set_placeholder_color_when_hint_is_not_set() {
let view = new textFieldModule.TextField();
let expectedColorHex = "#FFFF0000";
let expectedNormalizedColorHex = "#FF0000";
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
const view = new TextField();
const expectedColorHex = "#FFFF0000";
const expectedNormalizedColorHex = "#FF0000";
helper.buildUIAndRunTest(view, function (views: Array<View>) {
view.setInlineStyle("placeholder-color: " + expectedColorHex + ";");
let actualColorHex = textFieldTestsNative.getNativePlaceholderColor(view).hex;
const actualColorHex = getNativePlaceholderColor(view).hex;
TKUnit.assertEqual(actualColorHex, expectedNormalizedColorHex);
});
}
export function test_android_ime_actions_move_focus() {
if (isIOS) {
return;
}
const stack = new StackLayout();
const addTextField = () => {
const tf = new TextField();
(<any>tf).returnPress = 0
tf.on('returnPress', (args) => (<any>args.object).returnPress++);
stack.addChild(tf);
}
addTextField();
addTextField();
addTextField();
const assert = (index, count) => {
const view: any = stack.getChildAt(index);
TKUnit.assertEqual(view.returnPress, count, `TextField at ${index}, has incorrect returnPress.`);
}
helper.buildUIAndRunTest(stack, (views: Array<View>) => {
(stack.getChildAt(0) as TextField).focus();
let edittext = stack._context.getCurrentFocus();
TKUnit.assertNotNull(edittext, "TextField not focused.");
edittext.onEditorAction(android.view.inputmethod.EditorInfo.IME_ACTION_NEXT);
assert(0, 1);
assert(1, 0);
assert(2, 0);
edittext = stack._context.getCurrentFocus();
edittext.onEditorAction(android.view.inputmethod.EditorInfo.IME_ACTION_NEXT);
assert(0, 1);
assert(1, 1);
assert(2, 0);
edittext = stack._context.getCurrentFocus();
edittext.onEditorAction(android.view.inputmethod.EditorInfo.IME_ACTION_NEXT);
assert(0, 1);
assert(1, 1);
assert(2, 1);
edittext = stack._context.getCurrentFocus();
edittext.onEditorAction(android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS);
assert(0, 2);
assert(1, 1);
assert(2, 1);
edittext = stack._context.getCurrentFocus();
edittext.onEditorAction(android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS);
assert(0, 2);
assert(1, 1);
assert(2, 2);
edittext = stack._context.getCurrentFocus();
edittext.onEditorAction(android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS);
assert(0, 2);
assert(1, 2);
assert(2, 2);
});
}

View File

@ -117,9 +117,9 @@ function initializeEditTextListeners(): void {
}
// If action is ACTION_NEXT then do not close keyboard
if (actionId === android.view.inputmethod.EditorInfo.IME_ACTION_NEXT) {
if (actionId === android.view.inputmethod.EditorInfo.IME_ACTION_NEXT
|| actionId === android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS) {
owner._onReturnPress();
return true;
}
return false;