commit
a0703c9f4a
@ -0,0 +1,80 @@ |
||||
package net.pokeranalytics.android |
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4 |
||||
import androidx.test.platform.app.InstrumentationRegistry |
||||
import net.pokeranalytics.android.model.realm.Location |
||||
import net.pokeranalytics.android.model.realm.Session |
||||
import net.pokeranalytics.android.model.utils.FavoriteSessionFinder |
||||
import org.junit.Assert |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
|
||||
@RunWith(AndroidJUnit4::class) |
||||
|
||||
class FavoriteSessionUnitTest : RealmInstrumentedUnitTest() { |
||||
|
||||
@Test |
||||
fun testFavoriteWithoutLocation() { |
||||
|
||||
val realm = this.mockRealm |
||||
realm.beginTransaction() |
||||
|
||||
val s1 = realm.createObject(Session::class.java, "1") |
||||
val s2 = realm.createObject(Session::class.java, "2") |
||||
val s3 = realm.createObject(Session::class.java, "3") |
||||
|
||||
s1.cgBigBlind = 4.0 |
||||
s2.cgBigBlind = 4.0 |
||||
s3.cgBigBlind = 1.0 |
||||
|
||||
realm.insert(s1) |
||||
realm.insert(s2) |
||||
realm.insert(s3) |
||||
|
||||
realm.commitTransaction() |
||||
val favSession = FavoriteSessionFinder.favoriteSession(Session.Type.CASH_GAME, null, realm, InstrumentationRegistry.getInstrumentation().targetContext) |
||||
|
||||
if (favSession != null) { |
||||
Assert.assertEquals(4.0, favSession.cgBigBlind) |
||||
} else { |
||||
Assert.fail("session shouldn't be null") |
||||
} |
||||
|
||||
} |
||||
|
||||
@Test |
||||
fun testFavoriteWithLocation() { |
||||
|
||||
val realm = this.mockRealm |
||||
realm.beginTransaction() |
||||
|
||||
val s1 = realm.createObject(Session::class.java, "1") |
||||
val s2 = realm.createObject(Session::class.java, "2") |
||||
val s3 = realm.createObject(Session::class.java, "3") |
||||
|
||||
val loc1 = realm.createObject(Location::class.java, "1") |
||||
val loc2 = realm.createObject(Location::class.java, "2") |
||||
|
||||
s1.cgBigBlind = 4.0 |
||||
s2.cgBigBlind = 4.0 |
||||
s3.cgBigBlind = 1.0 |
||||
|
||||
s1.location = loc1 |
||||
s2.location = loc1 |
||||
s3.location = loc2 |
||||
|
||||
realm.insert(s1) |
||||
realm.insert(s2) |
||||
realm.insert(s3) |
||||
|
||||
realm.commitTransaction() |
||||
val favSession = FavoriteSessionFinder.favoriteSession(Session.Type.CASH_GAME, loc2, realm, InstrumentationRegistry.getInstrumentation().targetContext) |
||||
|
||||
if (favSession != null) { |
||||
Assert.assertEquals(1.0, favSession.cgBigBlind) |
||||
} else { |
||||
Assert.fail("session shouldn't be null") |
||||
} |
||||
|
||||
} |
||||
} |
||||
@ -0,0 +1,131 @@ |
||||
package net.pokeranalytics.android.model.utils |
||||
|
||||
import android.content.Context |
||||
import io.realm.Realm |
||||
import io.realm.Sort |
||||
import net.pokeranalytics.android.model.realm.Location |
||||
import net.pokeranalytics.android.model.realm.Session |
||||
import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow |
||||
|
||||
/** |
||||
* Returns all significant parameters concatenated in a String |
||||
* Not suitable for display |
||||
*/ |
||||
fun Session.parameterRepresentation(context: Context) : String { |
||||
var representation = "" |
||||
|
||||
this.significantFields().forEach { |
||||
representation += this.stringForRow(it, context) |
||||
} |
||||
return representation |
||||
|
||||
} |
||||
|
||||
/** |
||||
* Returns a list of fields used to determine which kind of session is favorite |
||||
*/ |
||||
private fun Session.significantFields() : List<SessionRow> { |
||||
when (this.type) { |
||||
Session.Type.CASH_GAME.ordinal -> { |
||||
return listOf( |
||||
SessionRow.GAME, |
||||
SessionRow.INITIAL_BUY_IN, |
||||
SessionRow.BANKROLL, |
||||
SessionRow.TABLE_SIZE, |
||||
SessionRow.TOURNAMENT_TYPE |
||||
) |
||||
} |
||||
Session.Type.TOURNAMENT.ordinal -> { |
||||
return listOf( |
||||
SessionRow.GAME, |
||||
SessionRow.BLINDS, |
||||
SessionRow.BANKROLL, |
||||
SessionRow.TABLE_SIZE |
||||
) |
||||
} |
||||
} |
||||
throw Exception("A session should always have a type: tournament or CG") |
||||
} |
||||
|
||||
/** |
||||
* A class providing convenience method to determine the favorite session of the user at a location |
||||
*/ |
||||
class FavoriteSessionFinder { |
||||
|
||||
/** |
||||
* A counter convenience class |
||||
*/ |
||||
class Counter(session: Session) { |
||||
|
||||
var session: Session = session |
||||
var counter: Int = 1 |
||||
|
||||
fun increment() { |
||||
this.counter++ |
||||
} |
||||
|
||||
} |
||||
|
||||
companion object { |
||||
|
||||
private val FAVORITE_SIGNIFICANT_SESSIONS = 15L |
||||
|
||||
/** |
||||
* Copies the favorite session parameters on the [newSession] |
||||
*/ |
||||
fun copyParametersFromFavoriteSession(newSession: Session, location: Location?, context: Context) { |
||||
|
||||
val favoriteSession = FavoriteSessionFinder.favoriteSession(newSession.type, location, newSession.realm, context) |
||||
|
||||
favoriteSession?.let { fav -> |
||||
|
||||
newSession.limit = fav.limit |
||||
newSession.game = fav.game |
||||
newSession.bankroll = fav.bankroll |
||||
newSession.tableSize = fav.tableSize |
||||
|
||||
when (newSession.type) { |
||||
Session.Type.CASH_GAME.ordinal -> { |
||||
newSession.cgSmallBlind = fav.cgSmallBlind |
||||
newSession.cgBigBlind = fav.cgBigBlind |
||||
} |
||||
Session.Type.TOURNAMENT.ordinal -> { |
||||
newSession.tournamentEntryFee = fav.tournamentEntryFee |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* Determines the favorite session given a [sessionType] and an optional [location] |
||||
*/ |
||||
private fun favoriteSession(sessionType: Int, location: Location?, realm: Realm, context: Context) : Session? { |
||||
|
||||
var lastSessionsQuery = realm.where(Session::class.java).equalTo("type", sessionType) |
||||
if (location != null) { |
||||
lastSessionsQuery.equalTo("location.id", location.id) |
||||
} |
||||
val lastSessions = lastSessionsQuery |
||||
.sort("timeFrame.startDate", Sort.DESCENDING) |
||||
.limit(FAVORITE_SIGNIFICANT_SESSIONS) |
||||
.findAll() |
||||
|
||||
var counters= hashMapOf<String, Counter>() |
||||
lastSessions.forEach { session -> |
||||
val representation = session.parameterRepresentation(context) |
||||
val counter = counters[representation] |
||||
if (counter != null) { |
||||
counter.increment() |
||||
} else { |
||||
counters[representation] = Counter(session) |
||||
} |
||||
} |
||||
|
||||
val sortedCounters = counters.values.sortedBy { it.counter } |
||||
return sortedCounters.first().session |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue