/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . android . tools . idea . ui builder . actions Ċ Ċ import Ġcom . android . Sdk Constants . BUTTON Ċ import Ġcom . android . Sdk Constants . CONSTRAINT _ LAYOUT Ċ import Ġcom . android . tools . idea . common . fixtures . Model Builder Ċ import Ġcom . android . tools . idea . common . model . Nl Component Ċ import Ġcom . android . tools . idea . ui builder . api . View Editor Ċ import Ġcom . android . tools . idea . ui builder . api . View Handler Ċ import Ġcom . android . tools . idea . ui builder . scene . Scene Test Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . mockito . Mockito . mock Ċ Ċ class ĠChain Style View Action Test : ĠScene Test () Ġ{ ĊĊĠ Ġfun Ġtest Chain Horizontal () Ġ{ ĊĠĠĠ ĠChain Style View Actions . HORIZONTAL _ CHAIN _ STY LES . forEach Ġ{ ĊĠĠĠĠĠ Ġverify Horizontal Chain Style ( it Ġas ĠChain Style View Action ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġtest Chain Vertical () Ġ{ ĊĠĠĠ ĠChain Style View Actions . VERTICAL _ CHAIN _ STY LES . forEach Ġ{ ĊĠĠĠĠĠ Ġverify Vertical Chain Style ( it Ġas ĠChain Style View Action ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġtest Chain Applicable () Ġ{ ĊĠĠĠ Ġval Ġbutton 0 Ġ= Ġmy Screen . get ("@ + id / button 0 "). component ĊĠĠĠ ĠassertNotNull ( button 0 ) ĊĠĠĠ Ġval Ġbutton 1 Ġ= Ġmy Screen . get ("@ id / button 1 "). component ĊĠĠĠ ĠassertNotNull ( button 1 ) ĊĠĠĠ Ġval Ġbutton 2 Ġ= Ġmy Screen . get ("@ id / button 2 "). component ĊĠĠĠ ĠassertNotNull ( button 2 ) ĊĠĠĠ Ġval Ġbutton 3 Ġ= Ġmy Screen . get ("@ id / button 3 "). component ĊĠĠĠ ĠassertNotNull ( button 3 ) ĊĠĠĠ Ġval Ġbutton 4 Ġ= Ġmy Screen . get ("@ + id / button 4 "). component ĊĠĠĠ ĠassertNotNull ( button 4 ) ĊĊĠĠĠ ĠChain Style View Actions . HORIZONTAL _ CHAIN _ STY LES . forEach Ġ{ ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 ), Ġit Ġas ĠChain Style View Action , Ġtrue ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 1 ), Ġit , Ġtrue ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 2 ), Ġit , Ġtrue ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 1 , Ġbutton 2 ), Ġit , Ġtrue ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 1 , Ġbutton 2 ), Ġit , Ġtrue ) ĊĊĠĠĠĠĠ Ġ// ĠVertical Ġstyles Ġcategor ized Ġunder Ġdifferent Ġmenu . ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 3 ), Ġit , Ġfalse ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 3 ), Ġit , Ġfalse ) ĊĊĠĠĠĠĠ Ġ// ĠAll Ġselected . ĠFor Ġnow Ġthis Ġis Ġnot Ġsupported . ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 1 , Ġbutton 2 , Ġbutton 3 ), Ġit , Ġfalse ) ĊĊĠĠĠĠĠ Ġ// ĠButton 4 Ġis Ġnot Ġconnected Ġin Ġchain . ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 4 ), Ġit , Ġfalse ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 4 ), Ġit , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠChain Style View Actions . VERTICAL _ CHAIN _ STY LES . forEach Ġ{ ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 ), Ġit Ġas ĠChain Style View Action , Ġtrue ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 3 ), Ġit , Ġtrue ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 3 ), Ġit , Ġtrue ) ĊĊĠĠĠĠĠ Ġ// ĠHorizontal Ġstyle Ġcategor ized Ġunder Ġdifferent Ġmenu . ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 1 ), Ġit , Ġfalse ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 2 ), Ġit , Ġfalse ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 2 ), Ġit , Ġfalse ) ĊĊĠĠĠĠĠ Ġ// ĠAll Ġselected . ĠFor Ġnow Ġthis Ġis Ġnot Ġsupported . ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 1 , Ġbutton 2 , Ġbutton 3 ), Ġit , Ġfalse ) ĊĊĠĠĠĠĠ Ġ// ĠButton 4 Ġis Ġnot Ġconnected Ġin Ġchain . ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 4 ), Ġit , Ġfalse ) ĊĠĠĠĠĠ Ġverify Applicable ( listOf ( button 0 , Ġbutton 4 ), Ġit , Ġfalse ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġverify Applicable ( ĊĠĠĠ Ġlist : ĠList < Nl Component >, ĊĠĠĠ Ġaction : ĠChain Style View Action , ĊĠĠĠ Ġexpected : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġmock View Editor Ġ= Ġmock ( View Editor :: class . java ) ĊĠĠĠ ĠMockito .` when `( mock View Editor . scene ). thenReturn ( my Scene ) ĊĊĠĠĠ ĠassertEquals ( expected , Ġaction . is Applicable ( mock View Editor , Ġlist )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġverify Vertical Chain Style ( action : ĠChain Style View Action ) Ġ{ ĊĠĠĠ Ġval Ġbutton 0 Ġ= Ġmy Screen . get ("@ + id / button 0 "). component ĊĠĠĠ Ġval Ġbutton 3 Ġ= Ġmy Screen . get ("@ id / button 3 "). component ĊĊĠĠĠ Ġval Ġmock View Editor Ġ= Ġmock ( View Editor :: class . java ) ĊĠĠĠ ĠMockito .` when `( mock View Editor . scene ). thenReturn ( my Scene ) ĊĠĠĠ Ġval Ġmock Handler Ġ= Ġmock ( View Handler :: class . java ) ĊĊĠĠĠ Ġaction . perform ( ĊĠĠĠĠĠ Ġmock View Editor , ĊĠĠĠĠĠ Ġmock Handler , ĊĠĠĠĠĠ Ġbutton 0 , ĊĠĠĠĠĠ Ġmutable ListOf ( button 0 , Ġbutton 3 ), ĊĠĠĠĠĠĠ 0 ) ĊĊĠĠĠ Ġmy Screen . get ("@ + id / button 0 ") ĊĠĠĠĠĠ Ġ. expect Xml ( ĊĠĠĠĠĠĠĠ Ġ""" < Button ĊĠĠĠĠĠĠĠ Ġandroid : id ="@ + id / button 0 " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" 1 0 0 dp " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height =" 2 0 dp " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Bottom _ to Top Of ="@ + id / button 3 " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Left _ to Left Of =" parent " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Right _ to Left Of ="@ + id / button 1 " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Top _ to Top Of =" parent " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Vertical _ chain Style ="${ action . style }" Ġ/> ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġverify Horizontal Chain Style ( action : ĠChain Style View Action ) Ġ{ ĊĠĠĠ Ġval Ġbutton 0 Ġ= Ġmy Screen . get ("@ + id / button 0 "). component ĊĠĠĠ Ġval Ġbutton 1 Ġ= Ġmy Screen . get ("@ id / button 1 "). component ĊĠĠĠ Ġval Ġbutton 2 Ġ= Ġmy Screen . get ("@ id / button 2 "). component ĊĊĠĠĠ Ġval Ġmock View Editor Ġ= Ġmock ( View Editor :: class . java ) ĊĠĠĠ ĠMockito .` when `( mock View Editor . scene ). thenReturn ( my Scene ) ĊĠĠĠ Ġval Ġmock Handler Ġ= Ġmock ( View Handler :: class . java ) ĊĊĠĠĠ Ġaction . perform ( ĊĠĠĠĠĠ Ġmock View Editor , ĊĠĠĠĠĠ Ġmock Handler , ĊĠĠĠĠĠ Ġbutton 0 , ĊĠĠĠĠĠ Ġmutable ListOf ( button 0 , Ġbutton 1 , Ġbutton 2 ), ĊĠĠĠĠĠĠ 0 ) ĊĊĠĠĠ Ġmy Screen . get ("@ + id / button 0 ") ĊĠĠĠĠĠ Ġ. expect Xml ( ĊĠĠĠĠĠĠĠ Ġ""" < Button ĊĠĠĠĠĠĠĠ Ġandroid : id ="@ + id / button 0 " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" 1 0 0 dp " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height =" 2 0 dp " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Bottom _ to Top Of ="@ + id / button 3 " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Horizontal _ chain Style ="${ action . style }" ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Left _ to Left Of =" parent " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Right _ to Left Of ="@ + id / button 1 " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Top _ to Top Of =" parent " Ġ/> ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCreate Ġa Ġmodel Ġwhere Ġbutton 0 Ġis Ġboth ĠHorizontal Ġ&& ĠVertical Ġchain . ĊĠĠ Ġ* Ġ 0 , Ġ 1 , Ġ 2 Ġare Ġin Ġhorizontal Ġchain ĊĠĠ Ġ* Ġ 0 , Ġ 3 Ġare Ġin Ġvertical Ġchain ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ 4 Ġis Ġnot Ġin Ġany Ġchain ĊĠĠ Ġ* ĊĠĠ Ġ* ĠNo Ġstyle Ġis Ġset Ġin Ġthe Ġchain . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġcreate Model (): ĠModel Builder Ġ{ ĊĠĠĠ Ġreturn Ġmodel (" constraint . xml ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent ( CONSTRAINT _ LAYOUT . default Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ("@ id / root ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bounds ( 0 , Ġ 0 , Ġ 1 0 0 0 , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width (" 1 0 0 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height (" 1 0 0 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" android : padding ", Ġ" 2 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. children ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent ( BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ("@ + id / button 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bounds ( 3 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width (" 1 0 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height (" 2 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Left _ to Left Of ", Ġ" parent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Right _ to Left Of ", Ġ"@ + id / button 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Bottom _ to Top Of ", Ġ"@ + id / button 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Top _ to Top Of ", Ġ" parent "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent ( BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ("@ id / button 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bounds ( 3 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width (" 1 0 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height (" 2 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Left _ to Right Of ", Ġ"@ id / button 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Right _ to Left Of ", Ġ"@ + id / button 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent ( BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ("@ id / button 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bounds ( 3 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width (" 1 0 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height (" 2 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Left _ to Right Of ", Ġ"@ id / button 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Right _ to Right Of ", Ġ" parent "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent ( BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ("@ id / button 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bounds ( 8 0 0 , Ġ 3 0 0 , Ġ 1 0 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width (" 1 0 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height (" 2 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Top _ to Bottom Of ", Ġ"@ id / button 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Bottom _ to Bottom Of ", Ġ" parent "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent ( BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ("@ + id / button 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bounds ( 8 0 0 , Ġ 3 0 0 , Ġ 1 0 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width (" 1 0 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height (" 2 0 dp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Top _ to Top Of ", Ġ" parent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Bottom _ to Bottom Of ", Ġ" parent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Attribute (" app : layout _ constraint Left _ to Left Of ", Ġ" parent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ }