Skip to content

Commit 2c80431

Browse files
Custom view (#1)
1 parent f7ec5fb commit 2c80431

File tree

68 files changed

+2660
-80
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+2660
-80
lines changed

.idea/codeStyles/Project.xml

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,21 @@ android {
2626

2727
dependencies {
2828
implementation fileTree(dir: "libs", include: ["*.jar"])
29+
30+
implementation project(":core:design")
31+
implementation project(":core:test")
32+
2933
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
34+
implementation 'com.google.android.material:material:1.2.1'
3035
implementation 'androidx.core:core-ktx:1.3.1'
3136
implementation 'androidx.appcompat:appcompat:1.2.0'
32-
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
37+
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
38+
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0-alpha07'
39+
3340
testImplementation 'junit:junit:4.13'
34-
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
35-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
3641

42+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
43+
androidTestImplementation 'androidx.test:runner:1.3.0'
44+
androidTestImplementation 'androidx.test:rules:1.3.0'
45+
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
3746
}

app/src/androidTest/java/io/github/viniciusalvesmello/androidcustomviewcomponents/ExampleInstrumentedTest.kt

Lines changed: 0 additions & 27 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.github.viniciusalvesmello.androidcustomviewcomponents.robot
2+
3+
import io.github.viniciusalvesmello.androidcustomviewcomponents.R
4+
import io.github.viniciusalvesmello.test.robot.ActionRobot
5+
import io.github.viniciusalvesmello.test.robot.AssetRobot
6+
7+
object CustomButtonActivityRobot {
8+
9+
fun actionRobot(init: ActionRobot.() -> Unit) {
10+
ActionRobot(ActionRobot()).init()
11+
}
12+
13+
fun assertRobot(init: AssertRobot.() -> Unit) {
14+
AssertRobot(AssetRobot()).init()
15+
}
16+
17+
class ActionRobot(private val robot: io.github.viniciusalvesmello.test.robot.ActionRobot) {
18+
19+
fun cbPrimaryEnabledClick() = robot.clickOnView(R.id.cbPrimaryEnabled)
20+
fun cbTypeWhatsAppEnabledClick() = robot.clickOnView(R.id.cbTypeWhatsAppEnabled)
21+
fun cbTypeWhatsAppWithPhoneClick() = robot.clickOnView(R.id.cbTypeWhatsAppWithPhone)
22+
fun cbTypePhoneEnabledClick() = robot.clickOnView(R.id.cbTypePhoneEnabled)
23+
fun cbTypePhoneWithNumberClick() = robot.clickOnView(R.id.cbTypePhoneWithNumber)
24+
}
25+
26+
class AssertRobot(private val robot: AssetRobot) {
27+
28+
fun tvLastActionWithText(text: String) = robot.viewWithText(R.id.tvLastAction, text)
29+
30+
fun cbPrimaryEnabledWithText(text: String) = robot.customButtonWithText(R.id.cbPrimaryEnabled, text)
31+
fun cbPrimaryEnabledIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbPrimaryEnabled, isEnabled)
32+
fun cbPrimaryEnabledIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbPrimaryEnabled, isLoading)
33+
34+
fun cbPrimaryDisabledWithText(text: String) = robot.customButtonWithText(R.id.cbPrimaryDisabled, text)
35+
fun cbPrimaryDisabledIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbPrimaryDisabled, isEnabled)
36+
fun cbPrimaryDisabledIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbPrimaryDisabled, isLoading)
37+
38+
fun cbTypeWhatsAppEnabledWithText(text: String) = robot.customButtonWithText(R.id.cbTypeWhatsAppEnabled, text)
39+
fun cbTypeWhatsAppEnabledIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbTypeWhatsAppEnabled, isEnabled)
40+
fun cbTypeWhatsAppEnabledIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbTypeWhatsAppEnabled, isLoading)
41+
42+
fun cbTypeWhatsAppDisabledWithText(text: String) = robot.customButtonWithText(R.id.cbTypeWhatsAppDisabled, text)
43+
fun cbTypeWhatsAppDisabledIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbTypeWhatsAppDisabled, isEnabled)
44+
fun cbTypeWhatsAppDisabledIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbTypeWhatsAppDisabled, isLoading)
45+
46+
fun cbTypeWhatsAppWithPhoneWithText(text: String) = robot.customButtonWithText(R.id.cbTypeWhatsAppWithPhone, text)
47+
fun cbTypeWhatsAppWithPhoneIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbTypeWhatsAppWithPhone, isEnabled)
48+
fun cbTypeWhatsAppWithPhoneIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbTypeWhatsAppWithPhone, isLoading)
49+
50+
fun cbTypePhoneEnabledWithText(text: String) = robot.customButtonWithText(R.id.cbTypePhoneEnabled, text)
51+
fun cbTypePhoneEnabledIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbTypePhoneEnabled, isEnabled)
52+
fun cbTypePhoneEnabledIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbTypePhoneEnabled, isLoading)
53+
54+
fun cbTypePhoneDisabledWithText(text: String) = robot.customButtonWithText(R.id.cbTypePhoneDisabled, text)
55+
fun cbTypePhoneDisabledIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbTypePhoneDisabled, isEnabled)
56+
fun cbTypePhoneDisabledIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbTypePhoneDisabled, isLoading)
57+
58+
fun cbTypePhoneWithNumberWithText(text: String) = robot.customButtonWithText(R.id.cbTypePhoneWithNumber, text)
59+
fun cbTypePhoneWithNumberIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbTypePhoneWithNumber, isEnabled)
60+
fun cbTypePhoneWithNumberIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbTypePhoneWithNumber, isLoading)
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package io.github.viniciusalvesmello.androidcustomviewcomponents.robot
2+
3+
import io.github.viniciusalvesmello.androidcustomviewcomponents.R
4+
import io.github.viniciusalvesmello.test.robot.ActionRobot
5+
import io.github.viniciusalvesmello.test.robot.AssetRobot
6+
7+
object CustomEditTextActivityRobot {
8+
9+
fun actionRobot(init: ActionRobot.() -> Unit) {
10+
ActionRobot(ActionRobot()).init()
11+
}
12+
13+
fun assertRobot(init: AssertRobot.() -> Unit) {
14+
AssertRobot(AssetRobot()).init()
15+
}
16+
17+
class ActionRobot(private val robot: io.github.viniciusalvesmello.test.robot.ActionRobot){
18+
19+
fun fillTextField(text: String) = robot.fillCustomEditText(R.id.cetText, text)
20+
fun clickCheckBoxTextRequired() = robot.clickOnView(R.id.mcbTextRequired)
21+
22+
fun fillNumberField(text: String) = robot.fillCustomEditText(R.id.cetNumber, text)
23+
fun clickCheckBoxNumberRequired() = robot.clickOnView(R.id.mcbNumberRequired)
24+
25+
fun fillMoneyField(text: String) = robot.fillCustomEditText(R.id.cetMoney, text)
26+
fun clickCheckBoxMoneyRequired() = robot.clickOnView(R.id.mcbMoneyRequired)
27+
28+
fun fillPhoneField(text: String) = robot.fillCustomEditText(R.id.cetPhone, text)
29+
fun clickCheckBoxPhoneRequired() = robot.clickOnView(R.id.mcbPhoneRequired)
30+
31+
fun fillCPFField(text: String) = robot.fillCustomEditText(R.id.cetCPF, text)
32+
fun clickCheckBoxCPFRequired() = robot.clickOnView(R.id.mcbCPFRequired)
33+
34+
fun fillCNPJField(text: String) = robot.fillCustomEditText(R.id.cetCNPJ, text)
35+
fun clickCheckBoxCNPJRequired() = robot.clickOnView(R.id.mcbCNPJRequired)
36+
37+
fun clickValidate() = robot.clickOnView(R.id.cbValidate)
38+
}
39+
40+
class AssertRobot(private val robot: AssetRobot) {
41+
42+
fun textFieldWithText(text: String) = robot.customEditTextWithText(R.id.cetText, text)
43+
fun textFieldWithHint(hint: String) = robot.customEditTextWithHint(R.id.cetText, hint)
44+
fun textFieldWithError(error: String) = robot.customEditTextWithError(R.id.cetText, error)
45+
fun textFieldIsRequired(isRequired: Boolean) = robot.customEditTextIsRequired(R.id.cetText, isRequired)
46+
fun checkBoxTextRequiredIsChecked(isChecked: Boolean) = robot.appCompatCheckBoxIsChecked(R.id.mcbTextRequired, isChecked)
47+
48+
fun numberFieldWithText(text: String) = robot.customEditTextWithText(R.id.cetNumber, text)
49+
fun numberFieldWithHint(hint: String) = robot.customEditTextWithHint(R.id.cetNumber, hint)
50+
fun numberFieldWithError(error: String) = robot.customEditTextWithError(R.id.cetNumber, error)
51+
fun numberFieldIsRequired(isRequired: Boolean) = robot.customEditTextIsRequired(R.id.cetNumber, isRequired)
52+
fun checkBoxNumberRequiredIsChecked(isChecked: Boolean) = robot.appCompatCheckBoxIsChecked(R.id.mcbNumberRequired, isChecked)
53+
54+
fun moneyFieldWithText(text: String) = robot.customEditTextWithText(R.id.cetMoney, text)
55+
fun moneyFieldWithHint(hint: String) = robot.customEditTextWithHint(R.id.cetMoney, hint)
56+
fun moneyFieldWithError(error: String) = robot.customEditTextWithError(R.id.cetMoney, error)
57+
fun moneyFieldIsRequired(isRequired: Boolean) = robot.customEditTextIsRequired(R.id.cetMoney, isRequired)
58+
fun checkBoxMoneyRequiredIsChecked(isChecked: Boolean) = robot.appCompatCheckBoxIsChecked(R.id.mcbMoneyRequired, isChecked)
59+
60+
fun phoneFieldWithText(text: String) = robot.customEditTextWithText(R.id.cetPhone, text)
61+
fun phoneFieldWithHint(hint: String) = robot.customEditTextWithHint(R.id.cetPhone, hint)
62+
fun phoneFieldWithError(error: String) = robot.customEditTextWithError(R.id.cetPhone, error)
63+
fun phoneFieldIsRequired(isRequired: Boolean) = robot.customEditTextIsRequired(R.id.cetPhone, isRequired)
64+
fun checkBoxPhoneRequiredIsChecked(isChecked: Boolean) = robot.appCompatCheckBoxIsChecked(R.id.mcbPhoneRequired, isChecked)
65+
66+
fun cpfFieldWithText(text: String) = robot.customEditTextWithText(R.id.cetCPF, text)
67+
fun cpfFieldWithHint(hint: String) = robot.customEditTextWithHint(R.id.cetCPF, hint)
68+
fun cpfFieldWithError(error: String) = robot.customEditTextWithError(R.id.cetCPF, error)
69+
fun cpfFieldIsRequired(isRequired: Boolean) = robot.customEditTextIsRequired(R.id.cetCPF, isRequired)
70+
fun checkBoxCPFRequiredIsChecked(isChecked: Boolean) = robot.appCompatCheckBoxIsChecked(R.id.mcbCPFRequired, isChecked)
71+
72+
fun cnpjFieldWithText(text: String) = robot.customEditTextWithText(R.id.cetCNPJ, text)
73+
fun cnpjFieldWithHint(hint: String) = robot.customEditTextWithHint(R.id.cetCNPJ, hint)
74+
fun cnpjFieldWithError(error: String) = robot.customEditTextWithError(R.id.cetCNPJ, error)
75+
fun cnpjFieldIsRequired(isRequired: Boolean) = robot.customEditTextIsRequired(R.id.cetCNPJ, isRequired)
76+
fun checkBoxCNPJRequiredIsChecked(isChecked: Boolean) = robot.appCompatCheckBoxIsChecked(R.id.mcbCNPJRequired, isChecked)
77+
78+
fun validateButtonWithText(text: String) = robot.customButtonWithText(R.id.cbValidate, text)
79+
fun validateButtonIsEnabled(isEnabled: Boolean) = robot.viewIsEnabled(R.id.cbValidate, isEnabled)
80+
fun validateButtonIsLoading(isLoading: Boolean) = robot.customButtonIsLoading(R.id.cbValidate, isLoading)
81+
}
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package io.github.viniciusalvesmello.androidcustomviewcomponents.test
2+
3+
import androidx.test.ext.junit.rules.ActivityScenarioRule
4+
import androidx.test.ext.junit.runners.AndroidJUnit4
5+
import androidx.test.filters.LargeTest
6+
import io.github.viniciusalvesmello.androidcustomviewcomponents.CustomButtonActivity
7+
import io.github.viniciusalvesmello.androidcustomviewcomponents.robot.CustomButtonActivityRobot.actionRobot
8+
import io.github.viniciusalvesmello.androidcustomviewcomponents.robot.CustomButtonActivityRobot.assertRobot
9+
import org.junit.Rule
10+
import org.junit.Test
11+
import org.junit.runner.RunWith
12+
13+
@RunWith(AndroidJUnit4::class)
14+
@LargeTest
15+
class CustomButtonActivityTest {
16+
17+
@get:Rule
18+
val activityRule = ActivityScenarioRule(CustomButtonActivity::class.java)
19+
20+
@Test
21+
fun givenInitialState_whenOpenScreen_shouldCheckAllData() {
22+
assertRobot {
23+
tvLastActionWithText("Last Action: None")
24+
25+
cbPrimaryEnabledWithText("Primary")
26+
cbPrimaryEnabledIsEnabled(true)
27+
cbPrimaryEnabledIsLoading(false)
28+
29+
cbPrimaryDisabledWithText("Primary")
30+
cbPrimaryDisabledIsEnabled(false)
31+
cbPrimaryDisabledIsLoading(false)
32+
33+
cbTypeWhatsAppEnabledWithText("WhatsApp")
34+
cbTypeWhatsAppEnabledIsEnabled(true)
35+
cbTypeWhatsAppEnabledIsLoading(false)
36+
37+
cbTypeWhatsAppDisabledWithText("WhatsApp")
38+
cbTypeWhatsAppDisabledIsEnabled(false)
39+
cbTypeWhatsAppDisabledIsLoading(false)
40+
41+
cbTypeWhatsAppWithPhoneWithText("(21) 98765-5544")
42+
cbTypeWhatsAppWithPhoneIsEnabled(true)
43+
cbTypeWhatsAppWithPhoneIsLoading(false)
44+
45+
cbTypePhoneEnabledWithText("Telefone")
46+
cbTypePhoneEnabledIsEnabled(true)
47+
cbTypePhoneEnabledIsLoading(false)
48+
49+
cbTypePhoneDisabledWithText("Telefone")
50+
cbTypePhoneDisabledIsEnabled(false)
51+
cbTypePhoneDisabledIsLoading(false)
52+
53+
cbTypePhoneWithNumberWithText("(21) 98765-5544")
54+
cbTypePhoneWithNumberIsEnabled(true)
55+
cbTypePhoneWithNumberIsLoading(false)
56+
}
57+
}
58+
59+
@Test
60+
fun givenButtonPrimaryEnabled_whenClick_shouldCheckLastActionAndLoadingButton() {
61+
actionRobot {
62+
cbPrimaryEnabledClick()
63+
}
64+
assertRobot {
65+
tvLastActionWithText("Last Action: Primary")
66+
cbPrimaryEnabledIsLoading(true)
67+
}
68+
}
69+
70+
@Test
71+
fun givenButtonWhatsAppEnabled_whenClick_shouldCheckLastActionAndLoadingButton() {
72+
actionRobot {
73+
cbTypeWhatsAppEnabledClick()
74+
}
75+
assertRobot {
76+
tvLastActionWithText("Last Action: WhatsApp")
77+
cbTypeWhatsAppEnabledIsLoading(true)
78+
}
79+
}
80+
81+
@Test
82+
fun givenButtonWhatsAppWithNumberPhone_whenClick_shouldCheckLastActionAndLoadingButton() {
83+
actionRobot {
84+
cbTypeWhatsAppWithPhoneClick()
85+
}
86+
assertRobot {
87+
tvLastActionWithText("Last Action: (21) 98765-5544")
88+
cbTypeWhatsAppWithPhoneIsLoading(true)
89+
}
90+
}
91+
92+
@Test
93+
fun givenButtonPhoneEnabled_whenClick_shouldCheckLastActionAndLoadingButton() {
94+
actionRobot {
95+
cbTypePhoneEnabledClick()
96+
}
97+
assertRobot {
98+
tvLastActionWithText("Last Action: Telefone")
99+
cbTypePhoneEnabledIsLoading(true)
100+
}
101+
}
102+
103+
@Test
104+
fun givenButtonPhoneWithNumber_whenClick_shouldCheckLastActionAndLoadingButton() {
105+
actionRobot {
106+
cbTypePhoneWithNumberClick()
107+
}
108+
assertRobot {
109+
tvLastActionWithText("Last Action: (21) 98765-5544")
110+
cbTypePhoneWithNumberIsLoading(true)
111+
}
112+
}
113+
}

0 commit comments

Comments
 (0)