mirror of https://github.com/tuskyapp/Tusky.git
Browse Source
* Move compose.* tests to own namespace
* Ignore "@instance..." part of username when computing status length
In a status with a mention ("@foo@example.org") only the "@foo" part should
be included in the calculated status length. It wasn't, so the app was
prevening people from posting statuses that should have been allowed.
Fix this.
- Lift the length calculation code in to a separate static function (easier
and faster to test)
- Add a `MentionSpan` type, to reuse existing code for detecting mentions
- Fix a bug in `FakeSpannable.getSpans()` (it was returning the outer type,
not the wrapped inner span)
- Add additional fast tests
The tests made sense under the `components.compose.ComposeActivity` package,
so I also created that and moved the existing ComposeActivity tests there.
Fixes https://github.com/tuskyapp/Tusky/issues/3339
* Static import assertEquals
pull/3442/head
8 changed files with 158 additions and 23 deletions
@ -0,0 +1,79 @@
|
||||
/* |
||||
* Copyright 2023 Tusky Contributors |
||||
* |
||||
* This file is a part of Tusky. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the |
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even |
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
||||
* Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License along with Tusky; if not, |
||||
* see <http://www.gnu.org/licenses>. |
||||
*/ |
||||
|
||||
package com.keylesspalace.tusky.components.compose.ComposeActivity |
||||
|
||||
import com.keylesspalace.tusky.SpanUtilsTest |
||||
import com.keylesspalace.tusky.components.compose.ComposeActivity |
||||
import com.keylesspalace.tusky.util.highlightSpans |
||||
import org.junit.Assert.assertEquals |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.Parameterized |
||||
|
||||
@RunWith(Parameterized::class) |
||||
class StatusLengthTest( |
||||
private val text: String, |
||||
private val expectedLength: Int |
||||
) { |
||||
companion object { |
||||
@Parameterized.Parameters(name = "{0}") |
||||
@JvmStatic |
||||
fun data(): Iterable<Any> { |
||||
return listOf( |
||||
arrayOf("", 0), |
||||
arrayOf(" ", 1), |
||||
arrayOf("123", 3), |
||||
// "@user@server" should be treated as "@user" |
||||
arrayOf("123 @example@example.org", 12), |
||||
// URLs under 23 chars are treated as 23 chars |
||||
arrayOf("123 http://example.url", 27), |
||||
// URLs over 23 chars are treated as 23 chars |
||||
arrayOf("123 http://urlthatislongerthan23characters.example.org", 27), |
||||
// Short hashtags are treated as is |
||||
arrayOf("123 #basictag", 13), |
||||
// Long hashtags are *also* treated as is (not treated as 23, like URLs) |
||||
arrayOf("123 #atagthatislongerthan23characters", 37) |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun statusLength_matchesExpectations() { |
||||
val spannedText = SpanUtilsTest.FakeSpannable(text) |
||||
highlightSpans(spannedText, 0) |
||||
|
||||
assertEquals( |
||||
expectedLength, |
||||
ComposeActivity.statusLength(spannedText, null, 23) |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun statusLength_withCwText_matchesExpectations() { |
||||
val spannedText = SpanUtilsTest.FakeSpannable(text) |
||||
highlightSpans(spannedText, 0) |
||||
|
||||
val cwText = SpanUtilsTest.FakeSpannable( |
||||
"a @example@example.org #hashtagmention and http://example.org URL" |
||||
) |
||||
assertEquals( |
||||
expectedLength + cwText.length, |
||||
ComposeActivity.statusLength(spannedText, cwText, 23) |
||||
) |
||||
} |
||||
} |
||||
Loading…
Reference in new issue