diff --git a/tests/app/fonts/Pacifico.ttf b/tests/app/fonts/Pacifico.ttf new file mode 100644 index 000000000..6d47cdc9a Binary files /dev/null and b/tests/app/fonts/Pacifico.ttf differ diff --git a/tests/app/ui/tab-view/tab-view-tests-native.android.ts b/tests/app/ui/tab-view/tab-view-tests-native.android.ts index c56f14d78..2c2b08d6f 100644 --- a/tests/app/ui/tab-view/tab-view-tests-native.android.ts +++ b/tests/app/ui/tab-view/tab-view-tests-native.android.ts @@ -15,4 +15,17 @@ export function selectNativeTab(tabView: tabViewModule.TabView, index: number): export function getNativeSelectedIndex(tabView: tabViewModule.TabView): number { var viewPager: android.support.v4.view.ViewPager = (tabView)._viewPager; return viewPager ? viewPager.getCurrentItem() : -1; +} + +export function getNativeFont(tabView: tabViewModule.TabView): any { + var tv: android.widget.TextView = ((tabView)._tabLayout).getTextViewForItemAt(0); + if (tv) { + return { + typeface: tv.getTypeface(), + size: tv.getTextSize() + } + } + else { + return null; + } } \ No newline at end of file diff --git a/tests/app/ui/tab-view/tab-view-tests-native.d.ts b/tests/app/ui/tab-view/tab-view-tests-native.d.ts index bb3b7a3db..55d300eef 100644 --- a/tests/app/ui/tab-view/tab-view-tests-native.d.ts +++ b/tests/app/ui/tab-view/tab-view-tests-native.d.ts @@ -3,4 +3,5 @@ import * as tabViewModule from "ui/tab-view"; export declare function getNativeTabCount(tabView: tabViewModule.TabView): number; export declare function selectNativeTab(tabView: tabViewModule.TabView, index: number): void; -export declare function getNativeSelectedIndex(tabView: tabViewModule.TabView): number; \ No newline at end of file +export declare function getNativeSelectedIndex(tabView: tabViewModule.TabView): number; +export declare function getNativeFont(tabView: tabViewModule.TabView): any; \ No newline at end of file diff --git a/tests/app/ui/tab-view/tab-view-tests-native.ios.ts b/tests/app/ui/tab-view/tab-view-tests-native.ios.ts index 4848a26e9..4f35a33c0 100644 --- a/tests/app/ui/tab-view/tab-view-tests-native.ios.ts +++ b/tests/app/ui/tab-view/tab-view-tests-native.ios.ts @@ -1,4 +1,6 @@ -import * as tabViewModule from "ui/tab-view"; +import tabViewModule = require("ui/tab-view"); +import * as utils from "utils/utils"; +import getter = utils.ios.getter; export function getNativeTabCount(tabView: tabViewModule.TabView): number { if (!tabView.ios.viewControllers) { @@ -15,4 +17,22 @@ export function selectNativeTab(tabView: tabViewModule.TabView, index: number): export function getNativeSelectedIndex(tabView: tabViewModule.TabView): number { return tabView.ios.selectedIndex; +} + +export function getNativeFont(tabView: tabViewModule.TabView): any { + let tabBar = tabView.ios.tabBar; + let currentFont; + + if (tabBar.items.count > 0) { + let currentAttrs = tabBar.items[0].titleTextAttributesForState(UIControlState.Normal); + if (currentAttrs) { + currentFont = currentAttrs.objectForKey(NSFontAttributeName); + } + } + + if (!currentFont) { + currentFont = UIFont.systemFontOfSize(getter(UIFont, UIFont.labelFontSize)); + } + + return currentFont; } \ No newline at end of file diff --git a/tests/app/ui/tab-view/tab-view-tests.ts b/tests/app/ui/tab-view/tab-view-tests.ts index 962f57332..5a33d57dc 100644 --- a/tests/app/ui/tab-view/tab-view-tests.ts +++ b/tests/app/ui/tab-view/tab-view-tests.ts @@ -1,9 +1,11 @@ -import * as testModule from "../../ui-test"; -import * as TKUnit from "../../TKUnit"; -import * as helper from "../helper"; -import * as labelModule from "ui/label"; -import * as stackLayoutModule from "ui/layouts/stack-layout"; -import * as tabViewTestsNative from "./tab-view-tests-native"; +import testModule = require("../../ui-test"); +import TKUnit = require("../../TKUnit"); +import helper = require("../helper"); +import labelModule = require("ui/label"); +import stackLayoutModule = require("ui/layouts/stack-layout"); +import tabViewTestsNative = require("./tab-view-tests-native"); +import style = require("ui/styling/style"); +import { resetStyleProperties } from "ui/core/view"; // Using a TabView requires the "ui/tab-view" module. // >> article-require-tabview-module @@ -281,102 +283,58 @@ export class TabViewTest extends testModule.UITest { TKUnit.assertEqual(actualNewIndex, expectedNewIndex, "expectedNewIndex"); } -// public testAndroidOffscreenTabLimit_Default = function () { -// let tabView = this.testView; -// if (!tabView.android){ -// return; -// } + public test_FontIsReappliedWhenTabItemsChange = function () { + // let fontToString = (font: any): string => { + // if (this.testView.ios){ + // return font.toString(); + // } + // else { + // return `${font.typeface} ${font.size}`; + // } + // } -// tabView.androidOffscreenTabLimit = 1; -// tabView.items = this._createItems(20); -// this.waitUntilTestElementIsLoaded(); -// for (let index = 0, length = tabView.items.length; index < length; index++){ -// tabViewTestsNative.selectNativeTab(tabView, index); -// TKUnit.waitUntilReady(function () { -// return tabView.selectedIndex === index; -// }, helper.ASYNC); -// } + let assertFontsAreEqual = (actual: any, expected: any, message?: string) => { + if (this.testView.ios){ + TKUnit.assertEqual(actual, expected, message); + } + else { + TKUnit.assertEqual(actual.typeface, expected.typeface, `${message} [typeface]`); + TKUnit.assertEqual(actual.size, expected.size, `${message} [size]`); + } + } -// let viewsWithParent = 0; -// let viewsWithoutParent = 0; -// for (let i = 0, length = tabView.items.length; i < length; i++){ -// if (tabView.items[i].view.parent) { -// viewsWithParent++; -// } -// else { -// viewsWithoutParent++; -// } -// } - -// TKUnit.assertTrue(viewsWithoutParent > viewsWithParent, `Most of the views should be recycled: viewsWithoutParent = ${viewsWithoutParent}; viewsWithParent = ${viewsWithParent};`); -// } - - // public testAndroidOffscreenTabLimit_KeepAllAlive = function () { - // let tabView = this.testView; - // if (!tabView.android){ - // return; - // } + //console.log(`>>>>>>>>>>>>> CREATE 3 ITEMS`); + this.testView.items = this._createItems(1); + this.waitUntilTestElementIsLoaded(); - // tabView.androidOffscreenTabLimit = 20; + let originalFont = tabViewTestsNative.getNativeFont(this.testView); + //console.log(`>>>>>>>>>>>>> originalFont: ${fontToString(originalFont)}`); + let nativeFont: any; + + //console.log(`>>>>>>>>>>>>> PACIFICO`); + this.testView.style.font = "20 Pacifico"; + nativeFont = tabViewTestsNative.getNativeFont(this.testView); + //console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`); - // tabView.items = this._createItems(20); - // this.waitUntilTestElementIsLoaded(); - // for (let index = 0, length = tabView.items.length; index < length; index++){ - // tabViewTestsNative.selectNativeTab(tabView, index); - // TKUnit.waitUntilReady(function () { - // return tabView.selectedIndex === index; - // }, helper.ASYNC); - // } + //console.log(`>>>>>>>>>>>>> CREATE 3 ITEMS`); + this.testView.items = this._createItems(2); + assertFontsAreEqual(tabViewTestsNative.getNativeFont(this.testView), nativeFont, "Font must be 20 Pacifico after rebinding items."); + //console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`); + + //console.log(`>>>>>>>>>>>>> MONOSPACE;`); + this.testView.style.font = "bold 12 monospace"; + nativeFont = tabViewTestsNative.getNativeFont(this.testView); + //console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`); + + //console.log(`>>>>>>>>>>>>> CREATE 3 ITEMS`); + this.testView.items = this._createItems(3); + assertFontsAreEqual(tabViewTestsNative.getNativeFont(this.testView), nativeFont, "Font must be bold 12 monospace after rebinding items."); + //console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`); - // for (let i = 0, length = tabView.items.length; i < length; i++){ - // TKUnit.assertNotNull(tabView.items[i].view.parent, `tabView.items[${i}].view should have a parent!`); - // } - // } - - /* - public testBindingIsRefreshedWhenTabViewItemIsUnselectedAndThenSelectedAgain() { - - var viewModel = new observable.Observable(); - viewModel.set("counter", 0); - this.testPage.bindingContext = viewModel; - - var tabView = this.testView; - var items = this._createItems(10); - - var StackLayout0 = new stackLayoutModule.StackLayout(); - var label0 = new labelModule.Label(); - label0.text = "Tab 0"; - label0.id = "testLabel"; - label0.bind({ sourceProperty: "counter", targetProperty: "text", twoWay: true }); - StackLayout0.addChild(label0); - var tabEntry0 = new tabViewModule.TabViewItem({ - title: "Tab 0", - view: StackLayout0 - }); - items.push(tabEntry0); - - tabView.items = items; - tabView.selectedIndex = 10; - TKUnit.waitUntilReady(function () { - return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex; - }, helper.ASYNC); - - TKUnit.assertEqual(label0.text, 0, "binding is not working!"); - - tabView.selectedIndex = 0; - TKUnit.waitUntilReady(function () { - return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex; - }, helper.ASYNC); - - tabView.selectedIndex = 10; - TKUnit.waitUntilReady(function () { - return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex; - }, helper.ASYNC); - - var expectedValue = 5; - viewModel.set("counter", expectedValue); - TKUnit.assertEqual(label0.text, expectedValue, "binding is not working!"); - }*/ + //console.log(`>>>>>>>>>>>>> RESET`); + resetStyleProperties(this.testView.style); + assertFontsAreEqual(tabViewTestsNative.getNativeFont(this.testView), originalFont, "Font must be the original one after resetting the style."); + } } export function createTestCase(): TabViewTest { diff --git a/tns-core-modules/ui/tab-view/tab-view.android.ts b/tns-core-modules/ui/tab-view/tab-view.android.ts index 408a97a13..d060c99a4 100644 --- a/tns-core-modules/ui/tab-view/tab-view.android.ts +++ b/tns-core-modules/ui/tab-view/tab-view.android.ts @@ -260,6 +260,14 @@ export class TabView extends TabViewBase { if (selectedIndex < 0) { this.selectedIndex = this._viewPager.getCurrentItem(); } +//<<<<<<< HEAD +//======= + +// this._updateSelectedIndexOnItemsPropertyChanged(data.newValue); + + // Style properties such as fonts need to re-applied on the newwly created native TextViews +// this.style._syncNativeProperties(); +//>>>>>>> ae68368... Fixed: Setting `setTypeface()` to null object } public _updateTabForItem(item: TabViewItem) { diff --git a/tns-core-modules/ui/tab-view/tab-view.ios.ts b/tns-core-modules/ui/tab-view/tab-view.ios.ts index 569431c6c..0eac8d8b5 100644 --- a/tns-core-modules/ui/tab-view/tab-view.ios.ts +++ b/tns-core-modules/ui/tab-view/tab-view.ios.ts @@ -361,11 +361,10 @@ export class TabView extends TabViewBase { return; } - const tabBar = this._ios.tabBar; + const tabBar = this.ios.tabBar; const states = getTitleAttributesForStates(this); - - for (let i = 0, count = tabBar.items.count; i < count; i++) { - const item = tabBar.items[i]; + for (let i = 0; i < tabBar.items.count; i++) { + const item = tabBar.items[i]; item.setTitleTextAttributesForState(states.normalState, UIControlState.Normal); item.setTitleTextAttributesForState(states.selectedState, UIControlState.Selected); } @@ -403,6 +402,7 @@ export class TabView extends TabViewBase { this.setViewControllers(value); } + get [tabTextColorProperty.native](): UIColor { return null; } @@ -433,6 +433,24 @@ export class TabView extends TabViewBase { this._updateIOSTabBarTextTransform(value); } + // private static getNativeFontValue(v: view.View) { + // var tabBar = v.ios.tabBar; + // let currentFont; + + // if (tabBar.items.count > 0) { + // let currentAttrs = tabBar.items[0].titleTextAttributesForState(UIControlState.Normal); + // if (currentAttrs) { + // currentFont = currentAttrs.objectForKey(NSFontAttributeName); + // } + // } + + // if (!currentFont) { + // currentFont = UIFont.systemFontOfSize(getter(UIFont, UIFont.labelFontSize)); + // } + + // return currentFont; + // } + // TODO: Move this to TabViewItem get [fontInternalProperty.native](): Font { return null; diff --git a/tns-platform-declarations/android/org.nativescript.widgets.d.ts b/tns-platform-declarations/android/org.nativescript.widgets.d.ts index b4062bec2..e43ad2f9d 100644 --- a/tns-platform-declarations/android/org.nativescript.widgets.d.ts +++ b/tns-platform-declarations/android/org.nativescript.widgets.d.ts @@ -361,6 +361,7 @@ getTextViewForItemAt(index: number): android.widget.TextView; getViewForItemAt(index: number): android.widget.LinearLayout; + getItemCount(): number; } export class TabItemSpec {