FragmentTransactionTest.java revision 47844337986f365dae294fb434de0c0f7f8df5db
1af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri/* 2af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Copyright (C) 2016 The Android Open Source Project 3af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 4af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Licensed under the Apache License, Version 2.0 (the "License"); 5af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * you may not use this file except in compliance with the License. 6af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * You may obtain a copy of the License at 7af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 8af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * http://www.apache.org/licenses/LICENSE-2.0 9af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 10af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Unless required by applicable law or agreed to in writing, software 11af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * distributed under the License is distributed on an "AS IS" BASIS, 12af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * See the License for the specific language governing permissions and 14af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * limitations under the License. 15af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri */ 16af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarripackage android.support.v4.app; 17af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 18af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport static junit.framework.TestCase.assertFalse; 19af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport static junit.framework.TestCase.assertTrue; 20af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 2147844337986f365dae294fb434de0c0f7f8df5dbGeorge Mountimport android.app.Instrumentation; 2247844337986f365dae294fb434de0c0f7f8df5dbGeorge Mountimport android.os.Bundle; 23af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.fragment.test.R; 24af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.InstrumentationRegistry; 2547844337986f365dae294fb434de0c0f7f8df5dbGeorge Mountimport android.support.test.annotation.UiThreadTest; 26754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest; 27af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.rule.ActivityTestRule; 28af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.runner.AndroidJUnit4; 29af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.v4.app.test.FragmentTestActivity; 30af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 31af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Before; 32af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Rule; 33af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Test; 34af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.runner.RunWith; 35af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 36af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri/** 37af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Tests usage of the {@link FragmentTransaction} class. 38af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri */ 39754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas@MediumTest 40af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri@RunWith(AndroidJUnit4.class) 41af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarripublic class FragmentTransactionTest { 42af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 43af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Rule 44af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public ActivityTestRule<FragmentTestActivity> mActivityRule = 45af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri new ActivityTestRule<>(FragmentTestActivity.class); 46af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 47af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private FragmentTestActivity mActivity; 48af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 49af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Before 50af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void setUp() { 51af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity = mActivityRule.getActivity(); 52af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 53af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 54af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 55c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithValidFragment() throws Throwable { 56af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new CorrectFragment(); 57c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 58af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 59af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 60af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 61af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 62af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 63af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 64af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 65af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 66af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 67af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 68af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue(fragment.isAdded()); 69af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 70af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 71af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 72c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithPrivateFragment() throws Throwable { 73af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new PrivateFragment(); 74c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 75af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 76af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 77af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 78af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 79af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 80af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 81af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 82af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 83af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 84af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 85af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 86af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 87af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 88af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 89af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 90af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 91af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 92af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 93af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 94af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 95af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 96c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithPackagePrivateFragment() throws Throwable { 97af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new PackagePrivateFragment(); 98c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 99af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 100af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 101af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 102af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 103af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 104af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 105af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 106af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 107af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 108af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 109af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 110af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 111af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 112af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 113af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 114af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 115af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 116af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 117af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 118af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 119af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 120c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithAnonymousFragment() throws Throwable { 121af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new Fragment() {}; 122c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 123af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 124af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 125af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 126af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 127af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 128af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 129af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 130af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 131af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 132af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 133af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 134af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 135af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 136af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 137af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 138af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 139af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 140af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 141af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 142af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 143af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 144c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithNonStaticFragment() throws Throwable { 145af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new NonStaticFragment(); 146c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 147af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 148af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 149af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 150af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 151af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 152af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 153af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 154af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 155af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 156af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 157af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 158af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 159af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 160af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 161af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 162af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 163af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 164af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 165af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 166af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 1675e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Test 1685e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void testPostOnCommit() throws Throwable { 1695e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell mActivityRule.runOnUiThread(new Runnable() { 1705e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Override 1715e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void run() { 1725e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell final boolean[] ran = new boolean[1]; 1735e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager(); 1745e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell fm.beginTransaction().postOnCommit(new Runnable() { 1755e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Override 1765e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void run() { 1775e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell ran[0] = true; 1785e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 1795e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell }).commit(); 1805e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell fm.executePendingTransactions(); 1815e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 1825e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell assertTrue("postOnCommit runnable never ran", ran[0]); 1835e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 1845e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell ran[0] = false; 1855e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 1865e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell boolean threw = false; 1875e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell try { 1885e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell fm.beginTransaction().postOnCommit(new Runnable() { 1895e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell @Override 1905e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell public void run() { 1915e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell ran[0] = true; 1925e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 1935e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell }).addToBackStack(null).commit(); 1945e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } catch (IllegalStateException ise) { 1955e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell threw = true; 1965e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 1975e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 1985e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell fm.executePendingTransactions(); 1995e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 2005e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell assertTrue("postOnCommit was allowed to be called for back stack transaction", 2015e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell threw); 2025e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell assertFalse("postOnCommit runnable for back stack transaction was run", ran[0]); 2035e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 2045e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell }); 2055e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell } 2065e2b030b851bde2b4569104a01b4acf6960327a6Adam Powell 20747844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount /** 20847844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount * Test to ensure that when onBackPressed() is received that there is no crash. 20947844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount */ 21047844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount @Test 21147844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount @UiThreadTest 21247844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount public void crashOnBackPressed() throws Throwable { 21347844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 21447844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount Bundle outState = new Bundle(); 21547844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount FragmentTestActivity activity = mActivityRule.getActivity(); 21647844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount instrumentation.callActivityOnSaveInstanceState(activity, outState); 21747844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount activity.onBackPressed(); 21847844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount } 21947844337986f365dae294fb434de0c0f7f8df5dbGeorge Mount 220af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public static class CorrectFragment extends Fragment {} 221af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 222af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private static class PrivateFragment extends Fragment {} 223af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 224af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri static class PackagePrivateFragment extends Fragment {} 225af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 226af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private class NonStaticFragment extends Fragment {} 227af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri} 228