tests: added GroupsParserTests
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
package agzam.vyatsu.data.remote
|
||||
|
||||
import agzam.vyatsu.domain.model.DateRange
|
||||
import agzam.vyatsu.domain.model.Season
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import java.io.InputStream
|
||||
|
||||
class GroupsParserTest {
|
||||
|
||||
private val faculty = "Факультет автоматики и вычислительной техники (ОРУ)"
|
||||
private val facultyShort = "ФАВТ (Факультет автоматики и вычислительной техники)"
|
||||
|
||||
private fun page(vararg blocks: String): String = blocks.joinToString("\n")
|
||||
|
||||
private fun facultyDiv(name: String): String = """<div class="fak_name">$name</div>"""
|
||||
|
||||
private fun groupDiv(periodId: String, name: String): String =
|
||||
"""<div class="grpPeriod" data-grp_period_id="$periodId">$name</div>"""
|
||||
|
||||
private fun pdfLink(url: String): String = """<a href="$url">x</a>"""
|
||||
|
||||
private fun parse(html: String): ParsedGroups =
|
||||
GroupsParser.parseStream(html.byteInputStream(Charsets.UTF_8))
|
||||
|
||||
private fun parseLineByLine(html: String): ParsedGroups {
|
||||
val lines = html.split("\n").map { "$it\n" }
|
||||
var index = 0
|
||||
val stream = object : InputStream() {
|
||||
override fun read(): Int = -1
|
||||
override fun read(b: ByteArray, off: Int, len: Int): Int {
|
||||
if (index >= lines.size) return -1
|
||||
val bytes = lines[index].toByteArray(Charsets.UTF_8)
|
||||
val n = minOf(len, bytes.size)
|
||||
System.arraycopy(bytes, 0, b, off, n)
|
||||
index++
|
||||
return n
|
||||
}
|
||||
}
|
||||
return GroupsParser.parseStream(stream)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun dropsLastDigitFromPeriodId() {
|
||||
val html = page(
|
||||
facultyDiv(faculty),
|
||||
groupDiv("123456", "ИВТб-3304-05-00 (бакалавриат)")
|
||||
)
|
||||
|
||||
val group = parse(html).groups.single()
|
||||
|
||||
assertEquals("12345", group.id)
|
||||
assertEquals("ИВТб-3304-05-00", group.name)
|
||||
assertEquals(facultyShort, group.faculty)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun removesParenthesizedSuffixFromGroupName() {
|
||||
val html = page(facultyDiv(faculty), groupDiv("777", "Группа А (подгруппа)"))
|
||||
|
||||
val group = parse(html).groups.single()
|
||||
|
||||
assertEquals("77", group.id)
|
||||
assertEquals("Группа А", group.name)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun keepsFacultyNameWhenNoShorthand() {
|
||||
val html = page(facultyDiv("Некий институт (ОРУ)"), groupDiv("5555", "Гр"))
|
||||
|
||||
val group = parse(html).groups.single()
|
||||
|
||||
assertEquals("Некий институт", group.faculty)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun facultyAppliesToGroupsUntilChanged() {
|
||||
val html = page(
|
||||
facultyDiv(faculty),
|
||||
groupDiv("1111", "А-1"),
|
||||
groupDiv("2222", "А-2"),
|
||||
facultyDiv("Юридический институт (факультет) (ОРУ)"),
|
||||
groupDiv("3333", "Ю-1")
|
||||
)
|
||||
|
||||
val faculties = parse(html).groups.map { it.faculty }
|
||||
|
||||
assertEquals(
|
||||
listOf(facultyShort, facultyShort, "ЮИ (Юридический институт)"),
|
||||
faculties
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun parsesDateRangesGroupedBySeason() {
|
||||
val html = page(
|
||||
pdfLink("/reports/schedule/Group/12345_1_14092026_27092026.pdf"),
|
||||
pdfLink("/reports/schedule/Group/12345_1_28092026_11102026.pdf"),
|
||||
pdfLink("/reports/schedule/Group/12345_2_09022027_22022027.pdf")
|
||||
)
|
||||
|
||||
val ranges = parse(html).dateRanges
|
||||
|
||||
assertEquals(
|
||||
listOf(DateRange("14092026", "27092026"), DateRange("28092026", "11102026")),
|
||||
ranges["12345"]?.get(Season.AUTUMN)
|
||||
)
|
||||
assertEquals(
|
||||
listOf(DateRange("09022027", "22022027")),
|
||||
ranges["12345"]?.get(Season.SPRING)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun ignoresUnrelatedLinks() {
|
||||
val html = page(
|
||||
pdfLink("/other/12345_1_14092026_27092026.pdf"),
|
||||
pdfLink("/reports/schedule/Group/123_1_14092026_27092026.pdf")
|
||||
)
|
||||
|
||||
assertTrue(parse(html).dateRanges.isEmpty())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun extractsRangesFromTextBeforeTag() {
|
||||
val html = "/reports/schedule/Group/12345_1_14092026_27092026.pdf " + pdfLink("#")
|
||||
|
||||
val ranges = parse(html).dateRanges
|
||||
|
||||
assertEquals(
|
||||
listOf(DateRange("14092026", "27092026")),
|
||||
ranges["12345"]?.get(Season.AUTUMN)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun greaterThanInsideQuotedAttributeDoesNotBreakTag() {
|
||||
val html = page(
|
||||
facultyDiv(faculty),
|
||||
"""<div class="grpPeriod" data-grp_period_id="555" title="a>b">Группа Б</div>"""
|
||||
)
|
||||
|
||||
val group = parse(html).groups.single()
|
||||
|
||||
assertEquals("55", group.id)
|
||||
assertEquals("Группа Б", group.name)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun multipleReadsProduceSameResultAsSingleRead() {
|
||||
val html = page(
|
||||
facultyDiv(faculty),
|
||||
groupDiv("123456", "ИВТб-3304-05-00 (бакалавриат)"),
|
||||
pdfLink("/reports/schedule/Group/12345_1_14092026_27092026.pdf"),
|
||||
groupDiv("7654321", "ИВТб-3304-05-01"),
|
||||
pdfLink("/reports/schedule/Group/765432_2_09022027_22022027.pdf")
|
||||
)
|
||||
|
||||
assertEquals(parse(html), parseLineByLine(html))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user