• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  * Copyright (C) 2020 The Dagger Authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dagger.hilt.android.simpleKotlin.viewmodel
18 
19 import android.os.Bundle
20 import androidx.activity.viewModels
21 import androidx.fragment.app.Fragment
22 import androidx.fragment.app.FragmentActivity
23 import androidx.fragment.app.FragmentManager
24 import androidx.fragment.app.activityViewModels
25 import androidx.fragment.app.viewModels
26 import androidx.test.core.app.ActivityScenario
27 import androidx.test.ext.junit.runners.AndroidJUnit4
28 import androidx.test.filters.LargeTest
29 import com.google.common.truth.Truth.assertThat
30 import dagger.hilt.android.AndroidEntryPoint
31 import dagger.hilt.android.testing.HiltAndroidRule
32 import dagger.hilt.android.testing.HiltAndroidTest
33 import org.junit.Rule
34 import org.junit.Test
35 import org.junit.runner.RunWith
36 
37 @LargeTest
38 @HiltAndroidTest
39 @RunWith(AndroidJUnit4::class)
40 class FragmentInjectionTest {
41 
42   @get:Rule
43   val rule = HiltAndroidRule(this)
44 
45   @Test
46   fun verifyInjection() {
47     ActivityScenario.launch(TestActivity::class.java).use {
48       it.onActivity { activity ->
49         activity.addTestFragment()
50         activity.supportFragmentManager.findTestFragment().let { fragment ->
51           assertThat(fragment.myAndroidViewModel).isNotNull()
52           assertThat(fragment.myViewModel).isNotNull()
53           assertThat(fragment.myInjectedViewModel).isNotNull()
54           assertThat(fragment.myInjectedViewModelWithSavedState).isNotNull()
55         }
56       }
57     }
58   }
59 
60   @Test
61   fun verifyActivityViewModelInjection() {
62     ActivityScenario.launch(TestActivity::class.java).use {
63       it.onActivity { activity ->
64         activity.addTestFragment()
65         activity.supportFragmentManager.findTestFragment().let { fragment ->
66           assertThat(fragment.myInjectedViewModel).isNotNull()
67           assertThat(fragment.myActivityLevelInjectedViewModel).isNotNull()
68           assertThat(fragment.myInjectedViewModel)
69             .isNotEqualTo(fragment.myActivityLevelInjectedViewModel)
70           assertThat(fragment.myActivityLevelInjectedViewModel)
71             .isEqualTo(activity.myInjectedViewModel)
72         }
73         activity.removeTestFragment()
74         activity.addTestFragment()
75         activity.supportFragmentManager.findTestFragment().let { fragment ->
76           assertThat(fragment.myInjectedViewModel).isNotNull()
77           assertThat(fragment.myActivityLevelInjectedViewModel).isNotNull()
78           assertThat(fragment.myInjectedViewModel)
79             .isNotEqualTo(fragment.myActivityLevelInjectedViewModel)
80           assertThat(fragment.myActivityLevelInjectedViewModel)
81             .isEqualTo(activity.myInjectedViewModel)
82         }
83       }
84     }
85   }
86 
87   @AndroidEntryPoint
88   class TestActivity : FragmentActivity() {
89 
90     val myInjectedViewModel by viewModels<MyInjectedViewModel>()
91 
92     override fun onCreate(savedInstanceState: Bundle?) {
93       super.onCreate(savedInstanceState)
94       addTestFragment()
95     }
96 
97     fun addTestFragment() {
98       val fragment = supportFragmentManager.fragmentFactory.instantiate(
99         TestFragment::class.java.classLoader!!,
100         TestFragment::class.java.name
101       )
102       supportFragmentManager.beginTransaction()
103         .add(0, fragment, FRAGMENT_TAG)
104         .commitNow()
105     }
106 
107     fun removeTestFragment() {
108       supportFragmentManager.beginTransaction()
109         .remove(supportFragmentManager.findFragmentByTag(FRAGMENT_TAG)!!)
110         .commitNow()
111     }
112   }
113 
114   @AndroidEntryPoint
115   class TestFragment : Fragment() {
116     val myAndroidViewModel by viewModels<MyAndroidViewModel>()
117     val myViewModel by viewModels<MyViewModel>()
118     val myInjectedViewModel by viewModels<MyInjectedViewModel>()
119     val myInjectedViewModelWithSavedState by viewModels<MyInjectedViewModelWithSavedState>()
120     val myActivityLevelInjectedViewModel by activityViewModels<MyInjectedViewModel>()
121   }
122 
123   private fun FragmentManager.findTestFragment() =
124     findFragmentByTag(FRAGMENT_TAG) as TestFragment
125 
126   companion object {
127     const val FRAGMENT_TAG = "tag"
128   }
129 }
130