Skip to content

Commit da9603a

Browse files
authored
Merge pull request #95 from AkYML/feature/merge_experiments
merge from experiments
2 parents 56e7235 + 973fb6f commit da9603a

File tree

45 files changed

+4480
-674
lines changed

Some content is hidden

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

45 files changed

+4480
-674
lines changed

.github/workflows/android.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ jobs:
1313

1414
steps:
1515
- uses: actions/checkout@v3
16-
- name: set up JDK 11
16+
- name: set up JDK 17
1717
uses: actions/setup-java@v3
1818
with:
19-
java-version: '11'
19+
java-version: '17'
2020
distribution: 'temurin'
2121
cache: gradle
2222

2323
- name: Grant execute permission for gradlew
2424
run: chmod +x gradlew
25-
- name: Build with Gradle
25+
- name: Clean and Build with Gradle
2626
run: ./gradlew clean build

YChartsLib/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@Suppress("DSL_SCOPE_VIOLATION") // scope violation issue: work around suggested from: https://github.com/gradle/gradle/issues/22797
12
plugins {
23
id("ycharts.android.library")
34
id("ycharts.android.library.compose")
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
package co.yml.charts.barchart
2+
3+
import androidx.compose.ui.Modifier
4+
import androidx.compose.ui.graphics.Color
5+
import androidx.compose.ui.test.*
6+
import androidx.compose.ui.test.junit4.createComposeRule
7+
import androidx.compose.ui.unit.dp
8+
import co.yml.charts.axis.AxisData
9+
import co.yml.charts.common.extensions.getMaxElementInYAxis
10+
import co.yml.charts.common.model.Point
11+
import co.yml.charts.ui.barchart.StackedBarChart
12+
import co.yml.charts.ui.barchart.models.*
13+
import org.junit.Rule
14+
import org.junit.Test
15+
16+
class StackedBarChartTest {
17+
@get:Rule
18+
val composeTestRule = createComposeRule()
19+
20+
private val barSize = 3
21+
private val listSize = 5
22+
private val groupBarData = getGroupBarChartTestData(listSize, barSize)
23+
private val yStepSize = 10
24+
25+
private val xAxisData = AxisData.Builder()
26+
.axisStepSize(30.dp)
27+
.steps(listSize - 1)
28+
.startDrawPadding(48.dp)
29+
.labelData { index -> "C $index" }
30+
.build()
31+
32+
private val yAxisData = AxisData.Builder()
33+
.steps(yStepSize)
34+
.labelAndAxisLinePadding(20.dp)
35+
.axisOffset(20.dp)
36+
.labelData { index ->
37+
val valueList = mutableListOf<Float>()
38+
groupBarData.map { groupBar ->
39+
var yMax = 0f
40+
groupBar.barList.forEach {
41+
yMax += it.point.y
42+
}
43+
valueList.add(yMax)
44+
}
45+
val maxElementInYAxis = getMaxElementInYAxis(valueList.maxOrNull() ?: 0f, yStepSize)
46+
47+
(index * (maxElementInYAxis / yStepSize)).toString()
48+
}
49+
.topPadding(36.dp)
50+
.build()
51+
52+
private val colorPaletteList = listOf(Color.Black, Color.Yellow, Color.Blue)
53+
private val groupBarPlotData = BarPlotData(
54+
groupBarList = groupBarData,
55+
barStyle = BarStyle(
56+
barWidth = 35.dp,
57+
selectionHighlightData = SelectionHighlightData(
58+
isHighlightFullBar = true,
59+
groupBarPopUpLabel = { name, value ->
60+
"Name"
61+
}
62+
)
63+
),
64+
barColorPaletteList = colorPaletteList
65+
)
66+
private val groupBarChartData = GroupBarChartData(
67+
barPlotData = groupBarPlotData,
68+
xAxisData = xAxisData,
69+
yAxisData = yAxisData,
70+
paddingBetweenStackedBars = 4.dp
71+
)
72+
73+
private fun startStackedBarChart(isTalkBackEnabled: Boolean = false) {
74+
composeTestRule.setContent {
75+
StackedBarChart(
76+
modifier = Modifier,
77+
groupBarChartData = groupBarChartData,
78+
isTalkBackEnabled
79+
)
80+
}
81+
}
82+
83+
@Test
84+
fun assertIfStackedBarChartIsDisplayed() {
85+
86+
startStackedBarChart()
87+
composeTestRule.onNodeWithTag("stacked_bar_chart", useUnmergedTree = true)
88+
.assertIsDisplayed()
89+
}
90+
91+
@Test
92+
fun assertIfCanvasIsDisplayed() {
93+
startStackedBarChart()
94+
95+
composeTestRule.onNodeWithTag("chart_canvas", useUnmergedTree = true)
96+
.assertExists()
97+
}
98+
99+
@Test
100+
fun assertIfXAxisIsDisplayed() {
101+
startStackedBarChart()
102+
103+
composeTestRule.onNodeWithTag("x_axis", useUnmergedTree = true)
104+
.assertExists()
105+
}
106+
107+
@Test
108+
fun assertIfYAxisIsDisplayed() {
109+
startStackedBarChart()
110+
111+
composeTestRule.onNodeWithTag("y_axis", useUnmergedTree = true)
112+
.assertExists()
113+
}
114+
115+
116+
@Test
117+
fun assertIfStackedBarClicked() {
118+
startStackedBarChart()
119+
120+
composeTestRule.onNode(hasAnyChild(hasClickAction()), useUnmergedTree = true)
121+
.onChildren()
122+
.onFirst()
123+
.performClick()
124+
}
125+
126+
@Test
127+
fun assertIfStackedBarChartHasCorrectBarData() {
128+
startStackedBarChart(isTalkBackEnabled = true)
129+
130+
composeTestRule.onNodeWithText("Bar at 0 with label B0 has value 20.00")
131+
.assertExists()
132+
}
133+
134+
135+
@Test
136+
fun assertIfStackedBarHasChartHasCorrectXAxisLabel() {
137+
startStackedBarChart(isTalkBackEnabled = true)
138+
139+
composeTestRule.onNodeWithText("X Axis label C 0")
140+
.assertExists()
141+
}
142+
143+
@Test
144+
fun assertIfStackedBarHasChartHasCorrectPrimaryCategoryData() {
145+
startStackedBarChart(isTalkBackEnabled = true)
146+
147+
composeTestRule.onNodeWithTag("AccessibilityBottomSheet List")
148+
.onChildren()
149+
.assertCountEquals(5)
150+
}
151+
152+
@Test
153+
fun assertIfPrimaryCategoryHasCorrectSecondaryVariableData() {
154+
startStackedBarChart(isTalkBackEnabled = true)
155+
156+
composeTestRule.onNodeWithText("X Axis label C 0")
157+
.onSiblings()
158+
.assertCountEquals(4)
159+
160+
}
161+
}
162+
163+
164+
fun getGroupBarChartTestData(listSize: Int, barSize: Int): List<GroupBar> {
165+
val list = mutableListOf<GroupBar>()
166+
for (index in 0 until listSize) {
167+
val barList = mutableListOf<BarData>()
168+
for (i in 0 until barSize) {
169+
val barValue = (((i + 1) * 10) + ((index + 1) * 10)).toFloat()
170+
barList.add(
171+
BarData(
172+
Point(
173+
index.toFloat(),
174+
barValue
175+
),
176+
label = "B$i",
177+
description = "Bar at $index with label B$i has value ${
178+
String.format(
179+
"%.2f", barValue
180+
)
181+
}"
182+
)
183+
)
184+
}
185+
list.add(GroupBar(index.toString(), barList))
186+
}
187+
return list
188+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package co.yml.charts.wavechart
2+
3+
import android.graphics.Typeface
4+
import androidx.compose.ui.Modifier
5+
import androidx.compose.ui.geometry.Offset
6+
import androidx.compose.ui.graphics.Color
7+
import androidx.compose.ui.graphics.drawscope.Stroke
8+
import androidx.compose.ui.test.assertIsDisplayed
9+
import androidx.compose.ui.test.junit4.createComposeRule
10+
import androidx.compose.ui.test.onNodeWithTag
11+
import androidx.compose.ui.unit.dp
12+
import co.yml.charts.axis.AxisData
13+
import co.yml.charts.common.extensions.formatToSinglePrecision
14+
import co.yml.charts.common.model.Point
15+
import co.yml.charts.ui.linechart.getMappingPointsToGraph
16+
import co.yml.charts.ui.linechart.model.LineStyle
17+
import co.yml.charts.ui.linechart.model.LineType
18+
import co.yml.charts.ui.linechart.model.SelectionHighlightPoint
19+
import co.yml.charts.ui.linechart.model.SelectionHighlightPopUp
20+
import co.yml.charts.ui.linechart.model.ShadowUnderLine
21+
import co.yml.charts.ui.wavechart.WaveChart
22+
import co.yml.charts.ui.wavechart.model.Wave
23+
import co.yml.charts.ui.wavechart.model.WaveChartData
24+
import co.yml.charts.ui.wavechart.model.WavePlotData
25+
import org.junit.Assert
26+
import org.junit.Rule
27+
import org.junit.Test
28+
29+
class WaveChartTest {
30+
@get:Rule
31+
val composeTestRule = createComposeRule()
32+
33+
private val pointsData = listOf(
34+
Point(0f, 0f),
35+
Point(1f, -3f),
36+
Point(2f, -5f),
37+
Point(3f, -2f),
38+
Point(4f, 2f),
39+
Point(5f, 5f),
40+
Point(6f, 4f),
41+
Point(7f, 0f),
42+
Point(8f, -1f),
43+
Point(9f, -3f),
44+
Point(10f, 0f),
45+
)
46+
private val steps = 10
47+
private val xAxisData = AxisData.Builder()
48+
.axisStepSize(40.dp)
49+
.steps(pointsData.size - 1)
50+
.labelData { i -> i.toString() }
51+
.labelAndAxisLinePadding(15.dp)
52+
.axisLineColor(Color.Red)
53+
.build()
54+
private val yAxisData = AxisData.Builder()
55+
.steps(steps)
56+
.labelData { i ->
57+
val yMin = pointsData.minOf { it.y }
58+
val yMax = pointsData.maxOf { it.y }
59+
val yScale = (yMax - yMin) / steps
60+
((i * yScale) + yMin).formatToSinglePrecision()
61+
}
62+
.axisLineColor(Color.Red)
63+
.labelAndAxisLinePadding(20.dp)
64+
.bottomPadding(15.dp)
65+
.build()
66+
private val data = WaveChartData(
67+
wavePlotData = WavePlotData(
68+
lines = listOf(
69+
Wave(
70+
dataPoints = pointsData,
71+
waveStyle = LineStyle(
72+
lineType = LineType.SmoothCurve(isDotted = true),
73+
color = Color.Green
74+
),
75+
shadowUnderLine = ShadowUnderLine(),
76+
selectionHighlightPoint = SelectionHighlightPoint(
77+
color = Color.Green
78+
),
79+
selectionHighlightPopUp = SelectionHighlightPopUp(
80+
backgroundColor = Color.Black,
81+
backgroundStyle = Stroke(2f),
82+
labelColor = Color.Red,
83+
labelTypeface = Typeface.DEFAULT_BOLD
84+
)
85+
)
86+
)
87+
),
88+
xAxisData = xAxisData,
89+
yAxisData = yAxisData
90+
)
91+
92+
@Test
93+
fun assertIfWaveChartIsDisplayed() {
94+
composeTestRule.setContent {
95+
WaveChart(modifier = Modifier, waveChartData = data)
96+
}
97+
composeTestRule.onNodeWithTag("wave_chart").assertIsDisplayed()
98+
}
99+
100+
@Test
101+
fun assertIfScrollableContainerIsDisplayed() {
102+
composeTestRule.setContent {
103+
WaveChart(modifier = Modifier, waveChartData = data)
104+
}
105+
composeTestRule.onNodeWithTag("scrollable_container").assertIsDisplayed()
106+
}
107+
108+
@Test
109+
fun getMappingPointsToGraphTest() {
110+
val mappedPoints = getMappingPointsToGraph(
111+
pointsData, 0f, 1f, 0f, 0f, 0f, 10f, 1f
112+
)
113+
val expectedResult = mutableListOf<Offset>()
114+
pointsData.forEach {
115+
expectedResult.add(Offset(it.x, (10f - it.y)))
116+
}
117+
Assert.assertEquals(expectedResult, mappedPoints)
118+
}
119+
120+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<manifest package="co.yml.charts.components"/>
2+
<manifest/>

0 commit comments

Comments
 (0)