Skip to content

Commit 65984d0

Browse files
Merge pull request #8 from MayconCardoso/feature/select-best-worst-stock-by-filter
Feature | Select best and worst stock according to selected filter
2 parents 1b32495 + 2dd6a58 commit 65984d0

File tree

10 files changed

+136
-27
lines changed

10 files changed

+136
-27
lines changed

domain/src/main/java/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectBestDailyStockShareCase.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package com.mctech.stocktradetracking.domain.stock_share.interaction
33
import com.mctech.stocktradetracking.domain.stock_share.entity.SelectedStock
44
import com.mctech.stocktradetracking.domain.stock_share.entity.StockShare
55
import com.mctech.stocktradetracking.domain.stock_share.interaction.strategies.SelectStockStrategy
6+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
7+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.StockFilter
68

79
class SelectBestDailyStockShareCase(
810
private val groupStockShareListCase: GroupStockShareListCase
911
) : SelectStockStrategy {
10-
override fun execute(stockShareList: List<StockShare>): SelectedStock? {
12+
13+
override fun execute(stockShareList: List<StockShare>, filter: StockFilter): SelectedStock? {
1114
return groupStockShareListCase.transform(stockShareList).maxBy {
12-
it.getDailyVariationBalance()
15+
selectMaxByFilter(filter, it)
1316
}?.let {
1417
SelectedStock(
1518
it.code,
@@ -19,4 +22,11 @@ class SelectBestDailyStockShareCase(
1922
)
2023
}
2124
}
25+
26+
private fun selectMaxByFilter(filter: StockFilter, item: StockShare): Double {
27+
return when (filter.rankingQualifier) {
28+
RankingQualifier.Balance -> item.getDailyVariationBalance()
29+
RankingQualifier.Percent -> item.getDailyVariation()
30+
}
31+
}
2232
}

domain/src/main/java/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectBestStockShareCase.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package com.mctech.stocktradetracking.domain.stock_share.interaction
33
import com.mctech.stocktradetracking.domain.stock_share.entity.SelectedStock
44
import com.mctech.stocktradetracking.domain.stock_share.entity.StockShare
55
import com.mctech.stocktradetracking.domain.stock_share.interaction.strategies.SelectStockStrategy
6+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
7+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.StockFilter
68

79
class SelectBestStockShareCase(
810
private val groupStockShareListCase: GroupStockShareListCase
911
) : SelectStockStrategy {
10-
override fun execute(stockShareList: List<StockShare>): SelectedStock? {
12+
override fun execute(stockShareList: List<StockShare>, filter: StockFilter): SelectedStock? {
1113
return groupStockShareListCase.transform(stockShareList).maxBy {
12-
it.getBalance()
14+
selectMaxByFilter(filter, it)
1315
}?.let {
1416
SelectedStock(
1517
it.code,
@@ -19,4 +21,11 @@ class SelectBestStockShareCase(
1921
)
2022
}
2123
}
24+
25+
private fun selectMaxByFilter(filter: StockFilter, item: StockShare): Double {
26+
return when (filter.rankingQualifier) {
27+
RankingQualifier.Balance -> item.getBalance()
28+
RankingQualifier.Percent -> item.getVariation()
29+
}
30+
}
2231
}

domain/src/main/java/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectWorstDailyStockShareCase.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package com.mctech.stocktradetracking.domain.stock_share.interaction
33
import com.mctech.stocktradetracking.domain.stock_share.entity.SelectedStock
44
import com.mctech.stocktradetracking.domain.stock_share.entity.StockShare
55
import com.mctech.stocktradetracking.domain.stock_share.interaction.strategies.SelectStockStrategy
6+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
7+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.StockFilter
68

79
class SelectWorstDailyStockShareCase(
810
private val groupStockShareListCase: GroupStockShareListCase
911
) : SelectStockStrategy {
10-
override fun execute(stockShareList: List<StockShare>): SelectedStock? {
12+
override fun execute(stockShareList: List<StockShare>, filter: StockFilter): SelectedStock? {
1113
return groupStockShareListCase.transform(stockShareList).minBy {
12-
it.getDailyVariationBalance()
14+
selectMinByFilter(filter, it)
1315
}?.let {
1416
SelectedStock(
1517
it.code,
@@ -19,4 +21,11 @@ class SelectWorstDailyStockShareCase(
1921
)
2022
}
2123
}
24+
25+
private fun selectMinByFilter(filter: StockFilter, item: StockShare): Double {
26+
return when (filter.rankingQualifier) {
27+
RankingQualifier.Balance -> item.getDailyVariationBalance()
28+
RankingQualifier.Percent -> item.getDailyVariation()
29+
}
30+
}
2231
}

domain/src/main/java/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectWorstStockShareCase.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package com.mctech.stocktradetracking.domain.stock_share.interaction
33
import com.mctech.stocktradetracking.domain.stock_share.entity.SelectedStock
44
import com.mctech.stocktradetracking.domain.stock_share.entity.StockShare
55
import com.mctech.stocktradetracking.domain.stock_share.interaction.strategies.SelectStockStrategy
6+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
7+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.StockFilter
68

79
class SelectWorstStockShareCase(
810
private val groupStockShareListCase: GroupStockShareListCase
911
) : SelectStockStrategy {
10-
override fun execute(stockShareList: List<StockShare>): SelectedStock? {
12+
override fun execute(stockShareList: List<StockShare>, filter: StockFilter): SelectedStock? {
1113
return groupStockShareListCase.transform(stockShareList).minBy {
12-
it.getBalance()
14+
selectMinByFilter(filter, it)
1315
}?.let {
1416
SelectedStock(
1517
it.code,
@@ -19,4 +21,11 @@ class SelectWorstStockShareCase(
1921
)
2022
}
2123
}
24+
25+
private fun selectMinByFilter(filter: StockFilter, item: StockShare): Double {
26+
return when (filter.rankingQualifier) {
27+
RankingQualifier.Balance -> item.getBalance()
28+
RankingQualifier.Percent -> item.getVariation()
29+
}
30+
}
2231
}

domain/src/main/java/com/mctech/stocktradetracking/domain/stock_share/interaction/strategies/SelectStockStrategy.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package com.mctech.stocktradetracking.domain.stock_share.interaction.strategies
22

33
import com.mctech.stocktradetracking.domain.stock_share.entity.SelectedStock
44
import com.mctech.stocktradetracking.domain.stock_share.entity.StockShare
5+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.StockFilter
56

67
interface SelectStockStrategy {
7-
fun execute(stockShareList: List<StockShare>): SelectedStock?
8+
fun execute(stockShareList: List<StockShare>, filter: StockFilter): SelectedStock?
89
}

domain/src/test/kotlin/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectBestDailyStockShareCaseTest.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package com.mctech.stocktradetracking.domain.stock_share.interaction
22

3+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
34
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareDataFactory
5+
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareFilterDataFactory
46
import com.mctech.stocktradetracking.testing.data_factory.testScenario
57
import kotlinx.coroutines.ExperimentalCoroutinesApi
68
import org.assertj.core.api.Assertions
79
import org.junit.Before
810
import org.junit.Test
911

10-
1112
@ExperimentalCoroutinesApi
1213
class SelectBestDailyStockShareCaseTest {
1314
private lateinit var useCase: SelectBestDailyStockShareCase
15+
private val balanceFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Balance)
16+
private val percentFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Percent)
1417

1518
@Before
1619
fun `before each test`() {
@@ -20,9 +23,23 @@ class SelectBestDailyStockShareCaseTest {
2023
}
2124

2225
@Test
23-
fun `should group list by code`() = testScenario(
26+
fun `should return best daily stock by balance`() = testScenario(
27+
action = {
28+
useCase.execute(StockShareDataFactory.ungroupedList(), balanceFilter)
29+
},
30+
assertions = { mglu ->
31+
Assertions.assertThat(mglu).isNotNull
32+
Assertions.assertThat(mglu?.code).isEqualTo("MGLU3")
33+
Assertions.assertThat(mglu?.balanceDescription).isEqualTo("R$1.400,00")
34+
Assertions.assertThat(mglu?.variation).isEqualTo(1400.0)
35+
Assertions.assertThat(mglu?.variationDescription).isEqualTo("25.0%")
36+
}
37+
)
38+
39+
@Test
40+
fun `should return best daily stock by percent`() = testScenario(
2441
action = {
25-
useCase.execute(StockShareDataFactory.ungroupedList())
42+
useCase.execute(StockShareDataFactory.ungroupedList(), percentFilter)
2643
},
2744
assertions = { mglu ->
2845
Assertions.assertThat(mglu).isNotNull

domain/src/test/kotlin/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectBestStockShareCaseTest.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mctech.stocktradetracking.domain.stock_share.interaction
22

3+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
34
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareDataFactory
5+
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareFilterDataFactory
46
import com.mctech.stocktradetracking.testing.data_factory.testScenario
57
import kotlinx.coroutines.ExperimentalCoroutinesApi
68
import org.assertj.core.api.Assertions.assertThat
@@ -10,6 +12,8 @@ import org.junit.Test
1012
@ExperimentalCoroutinesApi
1113
class SelectBestStockShareCaseTest {
1214
private lateinit var useCase: SelectBestStockShareCase
15+
private val balanceFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Balance)
16+
private val percentFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Percent)
1317

1418
@Before
1519
fun `before each test`() {
@@ -19,9 +23,23 @@ class SelectBestStockShareCaseTest {
1923
}
2024

2125
@Test
22-
fun `should group list by code`() = testScenario(
26+
fun `should return best stock by balance`() = testScenario(
2327
action = {
24-
useCase.execute(StockShareDataFactory.ungroupedList())
28+
useCase.execute(StockShareDataFactory.ungroupedList(), balanceFilter)
29+
},
30+
assertions = { mglu ->
31+
assertThat(mglu).isNotNull
32+
assertThat(mglu?.code).isEqualTo("MGLU3")
33+
assertThat(mglu?.balanceDescription).isEqualTo("R$1.800,00")
34+
assertThat(mglu?.variation).isEqualTo(34.62)
35+
assertThat(mglu?.variationDescription).isEqualTo("34.62%")
36+
}
37+
)
38+
39+
@Test
40+
fun `should return best stock by percent`() = testScenario(
41+
action = {
42+
useCase.execute(StockShareDataFactory.ungroupedList(), percentFilter)
2543
},
2644
assertions = { mglu ->
2745
assertThat(mglu).isNotNull

domain/src/test/kotlin/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectWorstDailyStockShareCaseTest.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mctech.stocktradetracking.domain.stock_share.interaction
22

3+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
34
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareDataFactory
5+
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareFilterDataFactory
46
import com.mctech.stocktradetracking.testing.data_factory.testScenario
57
import kotlinx.coroutines.ExperimentalCoroutinesApi
68
import org.assertj.core.api.Assertions
@@ -10,6 +12,8 @@ import org.junit.Test
1012
@ExperimentalCoroutinesApi
1113
class SelectWorstDailyStockShareCaseTest {
1214
private lateinit var useCase: SelectWorstDailyStockShareCase
15+
private val balanceFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Balance)
16+
private val percentFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Percent)
1317

1418
@Before
1519
fun `before each test`() {
@@ -19,9 +23,23 @@ class SelectWorstDailyStockShareCaseTest {
1923
}
2024

2125
@Test
22-
fun `should group list by code`() = testScenario(
26+
fun `should return worst daily stock by balance`() = testScenario(
2327
action = {
24-
useCase.execute(StockShareDataFactory.ungroupedList())
28+
useCase.execute(StockShareDataFactory.ungroupedList(), balanceFilter)
29+
},
30+
assertions = { wege3 ->
31+
Assertions.assertThat(wege3).isNotNull
32+
Assertions.assertThat(wege3?.code).isEqualTo("WEGE3")
33+
Assertions.assertThat(wege3?.balanceDescription).isEqualTo("-R$4.800,00")
34+
Assertions.assertThat(wege3?.variation).isEqualTo(-80.00)
35+
Assertions.assertThat(wege3?.variationDescription).isEqualTo("-80.0%")
36+
}
37+
)
38+
39+
@Test
40+
fun `should return worst daily stock by percent`() = testScenario(
41+
action = {
42+
useCase.execute(StockShareDataFactory.ungroupedList(), percentFilter)
2543
},
2644
assertions = { wege3 ->
2745
Assertions.assertThat(wege3).isNotNull

domain/src/test/kotlin/com/mctech/stocktradetracking/domain/stock_share/interaction/SelectWorstStockShareCaseTest.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mctech.stocktradetracking.domain.stock_share.interaction
22

3+
import com.mctech.stocktradetracking.domain.stock_share_filter.entity.RankingQualifier
34
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareDataFactory
5+
import com.mctech.stocktradetracking.testing.data_factory.factories.StockShareFilterDataFactory
46
import com.mctech.stocktradetracking.testing.data_factory.testScenario
57
import kotlinx.coroutines.ExperimentalCoroutinesApi
68
import org.assertj.core.api.Assertions.assertThat
@@ -10,6 +12,8 @@ import org.junit.Test
1012
@ExperimentalCoroutinesApi
1113
class SelectWorstStockShareCaseTest {
1214
private lateinit var useCase: SelectWorstStockShareCase
15+
private val balanceFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Balance)
16+
private val percentFilter = StockShareFilterDataFactory.single(ranking = RankingQualifier.Percent)
1317

1418
@Before
1519
fun `before each test`() {
@@ -19,9 +23,23 @@ class SelectWorstStockShareCaseTest {
1923
}
2024

2125
@Test
22-
fun `should group list by code`() = testScenario(
26+
fun `should return worst stock by balance`() = testScenario(
2327
action = {
24-
useCase.execute(StockShareDataFactory.ungroupedList())
28+
useCase.execute(StockShareDataFactory.ungroupedList(), balanceFilter)
29+
},
30+
assertions = { wege3 ->
31+
assertThat(wege3).isNotNull
32+
assertThat(wege3?.code).isEqualTo("WEGE3")
33+
assertThat(wege3?.balanceDescription).isEqualTo("-R$1.000,00")
34+
assertThat(wege3?.variation).isEqualTo(-45.45)
35+
assertThat(wege3?.variationDescription).isEqualTo("-45.45%")
36+
}
37+
)
38+
39+
@Test
40+
fun `should return worst stock by percent`() = testScenario(
41+
action = {
42+
useCase.execute(StockShareDataFactory.ungroupedList(), percentFilter)
2543
},
2644
assertions = { wege3 ->
2745
assertThat(wege3).isNotNull

features/feature-stock-share/src/main/java/com/mctech/stocktradetracking/feature/stock_share/list_position/StockShareListViewModel.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ open class StockShareListViewModel constructor(
104104
StockShareListResult(list, filter)
105105
}
106106
.collect { result ->
107-
computeStockScore(result.list)
107+
computeStockScore(result)
108108
organizeStockListBeforeShowIt(result)
109109
}
110110
}
@@ -156,14 +156,14 @@ open class StockShareListViewModel constructor(
156156
_shareList.changeToSuccessState(stockShareList)
157157
}
158158

159-
private fun computeStockScore(stockShareList: List<StockShare>) {
159+
private fun computeStockScore(result: StockShareListResult) {
160160
dataTransformerScope?.cancel()
161161

162162
dataTransformerScope = viewModelScope + Job()
163163

164-
dataTransformerScope?.async { computeFinalBalance(stockShareList) }
165-
dataTransformerScope?.async { computeBestStock(stockShareList) }
166-
dataTransformerScope?.async { computeWorstStock(stockShareList) }
164+
dataTransformerScope?.async { computeFinalBalance(result.list) }
165+
dataTransformerScope?.async { computeBestStock(result) }
166+
dataTransformerScope?.async { computeWorstStock(result) }
167167
}
168168

169169
private fun computeFinalBalance(stockShareList: List<StockShare>) {
@@ -173,17 +173,17 @@ open class StockShareListViewModel constructor(
173173
)
174174
}
175175

176-
private fun computeWorstStock(stockShareList: List<StockShare>) {
176+
private fun computeWorstStock(result: StockShareListResult) {
177177
_worstStockShare.changeToLoadingState()
178178
_worstStockShare.changeToSuccessState(
179-
selectWorstStockShareCase.execute(stockShareList)
179+
selectWorstStockShareCase.execute(result.list, result.filter)
180180
)
181181
}
182182

183-
private fun computeBestStock(stockShareList: List<StockShare>) {
183+
private fun computeBestStock(result: StockShareListResult) {
184184
_bestStockShare.changeToLoadingState()
185185
_bestStockShare.changeToSuccessState(
186-
selectBestStockShareCase.execute(stockShareList)
186+
selectBestStockShareCase.execute(result.list, result.filter)
187187
)
188188
}
189189

0 commit comments

Comments
 (0)