Merge branch 'main' into main

pull/749/head
greenart7c3 2024-03-13 11:24:12 -03:00 zatwierdzone przez GitHub
commit 0d47e8b823
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
2 zmienionych plików z 73 dodań i 1 usunięć

Wyświetl plik

@ -0,0 +1,59 @@
/**
* Copyright (c) 2024 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.vitorpamplona.amethyst.commons
import androidx.test.ext.junit.runners.AndroidJUnit4
import junit.framework.TestCase.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ExpandableTextCutOffCalculatorTest {
val shortPost: String =
"Goldman Sachs Predicts Modest Gains for S&P 500 in 2024 ( #409962b2 , v0.09)"
val longPost: String =
"Goldman Sachs Predicts Modest Gains for S&P 500 in 2024 ( #409962b2 , v0.09)\n" +
"\n" +
"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIiA/Pgo8c3ZnIHdpZHRoPSIzMjAiIGhlaWdodD0iNjUiIHZpZXdCb3g9IjAgMCAzMjAgNjUiIGZpbGw9ImJsYWNrIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aAogICAgZmlsbC1ydWxlPSJldmVub2RkIgogICAgY2xpcC1ydWxlPSJldmVub2RkIgogICAgZD0iTTguNTk4MjggNDIuMTU1OEM3LjgxMjgxIDQ5LjA1OTkgNS45ODMyNCA0OC44Njg4IDMuNzYzMDYgNDkuNDMzOUMxLjc1MjU1IDQ5Ljk0MzggMi41MTk5MyA1MS4xMjcyIDMuODI2OTIgNTAuOTQwMkM0LjMxMjI1IDUwLjg3MDcgNy45MDU0MSA1MC41MDE4IDEwLjM2MTkgNTAuNTAxOEMxMy44MDI4IDUwLjUwMTggMTYuOTI1NiA1MC44MTM1IDE4LjYwOTMgNTAuODEzNUMxOS4zMTE4IDUwLjgxMzUgMjAuMjMyNCA0OS44NzU0IDE4LjUzMTYgNDkuNDMzOUMxNi41NjQ3IDQ4LjkyNiAxMS43MzkxIDQ5LjQzMzkgMTEuMjc4MyA0MS4xNTEzQzEwLjk0MyAzNS4wOTE0IDExLjUwMTggMTQuMzcxMSAxMS41MDE4IDE0LjM3MTFDMTEuNTAxOCAxMi45MjQxIDExLjcxMzYgMTIuNzA1NCAxMS45OTM1IDEyLjcwNTRDMTIuNDgyIDEyLjcwNTQgMTIuOTk1IDEzLjUyMTkgMTMuNDY5NyAxNC4wODE5TDQzLjQ5NzUgNTAuNzQ5MUM0Ni42NjcgNTQuMzA1MyA0Ni44NjM5IDUzLjIzNzQgNDYuOCA0OS42NjA4QzQ2LjU5MTQgMzguMTE4MyA0Ni45NjI5IDYuMjYxMjQgNDYuOTYyOSA2LjI2MTI0QzQ3LjA1NDQgLTAuMDA4MTc1MTYgNTIuOTQyMyAyLjUzNzQgNTIuOTQyMyAwLjY1NDAyM0M1Mi45NDIzIDAuMjE4Njg5IDUyLjY2MjMgMCA1Mi4yNDE5IDBDNTAuNTU2IDAgNDUuNzA3IDAuNTA0ODI0IDQzLjMyMDggMC41MDQ4MjRDNDEuMDcxOSAwLjUwNDgyNCAzOS43NDE1IDAuMTc4ODM0IDM3LjYzNTIgMC4xNzg4MzRDMzcuMjE2OSAwLjE3ODgzNCAzNi44NTYxIDAuMzk3NTIzIDM2Ljg2MzUgMC45MDU0MTJDMzYuODk1NSAyLjkzNzk5IDQ0LjQ0NjggLTAuNDEzODc0IDQ0LjE4NSA5Ljk0MDEyTDQ0LjI1OTUgMzkuOTM2M0M0NC4yNTk1IDQwLjUxNDcgNDQuMjE5MSA0MS42NTUxIDQzLjIwNjkgMzkuOTM2M0wxMS43Njc4IDEuOTA3OTFDMTEuMzQ1MyAxLjQwMTA0IDEwLjcxNTIgMC4yNDExNzEgOS45NDE0NiAwLjI0MTE3MUM4Ljg4ODg0IDAuMjQxMTcxIDUuNDA5NTcgMC41MDQ4MjQgNC4zNTY5NSAwLjUwNDgyNEMzLjIzNDA5IDAuNTA0ODI0IDIuMTgwNDEgMC4yMTU2MjMgMS4wNTc1NSAwLjIxNTYyM0MwLjcwNzM4OSAwLjIxNTYyMyAtMC4wNjEwNTI5IDAuNTA3ODg5IDAuMDAzODcwODYgMC45MzkxMzZDMC4zOTg3MzUgMy40NzY1NCA4LjYzMTI4IDAuNDY3MDEyIDguNzY0MzIgMTIuMzI2M0M4Ljc2NDMyIDEyLjMyNjMgOC45MzU2NyAzOS4xNzcgOC41OTgyOCA0Mi4xNTU4WiIKICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIyMy4yMjQgNS43NDIxOSkiCiAgLz4KPHBhdGgKICAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgIGNsaXAtcnVsZT0iZXZlbm9kZCIKICAgIGQ9Ik01LjY1NTE4IDAuMDU3NjM2MkM0LjcwOSAwLjMzMzU1MiAzLjIwNDA0IDEuNTI1MSAyLjU4NTY3IDEuOTM4OTdDMS44NzM2NCAyLjQxODI1IDEuODg4NTQgMy4yMTAyMyAyLjI1MzYgMy44ODU3MUM0LjAyMjUxIDcuMTQ4NjcgNS43NzExOSAxMi41MzQxIDEuNDA2NCAxOS4wMUMwLjY4Nzk4MSAyMC4wNzU4IC0wLjQyMzE3MiAyMC4zODk2IDAuMTY2NDYzIDIwLjgzQzAuNzg4MDI4IDIxLjI5NiAyLjc5MTA4IDE5Ljk5MSAzLjYyNjU4IDE5LjE5N0M4LjMzNTE1IDE0Ljc0MDQgMTAuMDMzOCA3LjE0ODY3IDcuMzUzODQgMS42MjYyN0M2LjgwODkxIDAuNTAzMTg5IDYuNTg2NDYgLTAuMjE0MTkyIDUuNjU1MTggMC4wNTc2MzYyWiIKICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI3NS4wNzQpIgogIC8+CjxwYXRoCiAgICBmaWxsLXJ" +
"1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMS4zODg4NiA0OC4zMTk3QzEuNjc5NDIgNDkuNjE0NSA3LjgwMzU0IDUyLjE0NzggMTMuMjI2MyA1Mi4xNDc4QzI5Ljg2NyA1Mi4xNDc4IDMzLjgwMjggNDMuNDM1IDMzLjgwMjggMzcuNDAwNkMzMy44MDI4IDE4LjMyMzYgNS41Njc0IDI1LjMwNTMgNS41Njc0IDExLjc5NTZDNS41Njc0IDUuMTg4OTUgMTAuODg4IDIuMzg0ODMgMTYuNjc4OSAyLjM4NDgzQzIzLjEzMyAyLjM4NDgzIDI4LjMzOTcgNi4zNzMzNSAzMC4yNDM3IDExLjI1NzFDMzAuNDg5NiAxMS44OTI3IDMwLjgwNjggMTMuMzI5NSAzMS42MTI1IDEzLjMyOTVDMzIuMzQ3OSAxMy4zMjk1IDMyLjE3NjUgMTIuODExNCAzMi4xMDYzIDEyLjIzNkwzMS4wNTU4IDIuMTk3ODJDMzAuOTgzNCAxLjQwNTg0IDMwLjYxOTQgMS4xOTEyNCAzMC4xNzY3IDEuMTkxMjRDMjkuNDQ0NCAxLjE5MTI0IDI4Ljk5ODUgMi40NzE2OSAyNy42Mjg3IDIuMjIwM0MyNi42MTk3IDIuMDM2MzYgMjQuODQ5NyAwLjA2NDA3MyAxNy4yNjk2IDAuMDAwNzE0NTNDOC44MzcgLTAuMDY4Nzc1NCAxLjY1MDY5IDQuOTMyNDUgMS42NTA2OSAxNC4wNTcxQzEuNjUwNjkgMzIuMTI5NiAyOS4wOTc1IDI1LjIyNTYgMjkuMjMxNiAzOC41MzA4QzI5LjI5OTcgNDYuMDczNSAyNC4yOTc0IDQ5Ljk1MDcgMTcuMzMwMyA0OS45NTA3QzcuMjE3MSA0OS45NTA3IDIuNzU1NDYgNDIuNDIyMyAxLjg3ODQ1IDM5LjExODRDMS41MTAyIDM3LjYxMDEgMS4zNTI2OCAzNi43OTc3IDAuNTY3MjA2IDM2LjkyMjNDLTAuMTU0NDA1IDM3LjAzODggLTAuMDg0MTU5NyAzNy44NDYxIDAuMjEwNjU4IDM5LjI4M0MwLjIxMDY1OCAzOS4yODMgMS4xNTc5MSA0Mi4zODE0IDEuMzg4ODYgNDguMzE5N1oiCiAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyODUuNDk1IDQuNDUxMTcpIgogIC8+CjxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMjYuMjA1OCA1My4yMTI5QzQyLjg5OTcgNTMuMjEyOSA1NC41MDUxIDQyLjU1NTQgNTQuNTA1MSAyNi4wMTg5QzU0LjUwNTEgMTAuODAyNiA0Mi43NTE3IDAgMjcuNDc5OCAwQzEyLjEzMDEgMCAwIDExLjA5NjkgMCAyNi4zODY3QzAgNDEuODkzMiA5Ljk1NTY4IDUzLjIxMjkgMjYuMjA1OCA1My4yMTI5Wk0yNS42NTYgMi45MDgyQzQwLjI1NDMgMi45MDgyIDQ5LjA0NTYgMTUuNDMzOCA0OS4wNDU2IDI4LjgwOTVDNDkuMDQ1NiA0Mi40MDkxIDM5Ljg1NzMgNTAuNzI2NCAyOC45MjU2IDUwLjcyNjRDMTQuMDk5NiA1MC43MjY0IDUuNDcyMTcgMzcuODQ5NCA1LjQ3MjE3IDI0LjI1MzlDNS40NzIxNyAxMi42Mzk5IDEzLjA3NjggMi45MDgyIDI1LjY1NiAyLjkwODJaIgogICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTcyLjI1NiA0LjgyODEyKSIKICAvPgo8cGF0aAogICAgZmlsbC1ydWxlPSJldmVub2RkIgogICAgY2xpcC1ydWxlPSJldmVub2RkIgogICAgZD0iTTI3LjA4MDYgMjUuMzkwMkMzMS44MjIyIDIzLjM3MDkgMzYuMjcyMSAxOC44MTkzIDM2LjI3MjEgMTMuMTkwNkMzNi4yNzIxIC0wLjczODAxNiAyMC42MTU5IDAuMDA2OTU2NTEgMTkuNTMxNCAwLjAwNjk1NjUxQzE2LjAwNjQgMC4wMDY5NTY1MSAxMS40MzgzIDAuNjU2ODkxIDcuNTA0NTQgMC42NTY4OTFDNC4wNDk3NSAwLjY1Njg5MSAyLjU3NjczIDAuMjc1NzE5IDEuMzU3MDEgMC4yNzU3MTlDMC41NDI4MDUgMC4yNzU3MTkgMCAwLjcwOTAwOSAwIDEuMTQyM0MwIDMuNTk1OTEgNy44NDE5MyAtMC4wNTAyNzAzIDcuNjQyOTEgNy42NThWNDQuMzkyNkM3LjY0MjkxIDQ5Ljg3NTEgMy42OTIxNCA0OS40MjM1IDIuODQzODcgNTAuMDQ4OUMyLjQ4NzMyIDUwLjMxMzUgMi4xMDk0OSA1MS4zMDQ4IDIuNTE2MDYgNTEuMzA0OEM1LjA5MDY2IDUxLjMwNDggNy45ODAzIDUwLjk5MzEgMTAuNTU2IDUwLjk5MzFDMTYuMTgyIDUwLjk5MzEgMTkuNjMwNCA1MS4yNjE5" +
"IDIwLjIxNjggNTEuNDIxM0MyMS4yMDc3IDUxLjY4MjkgMjEuNjY0MyA1MC40OTAzIDIwLjU1MzEgNTAuMTEzM0MxOS4xOTUxIDQ5LjY1MzQgMTMuMTAyOSA1MC40MjggMTIuOTk3NSA0NC40NjUyVjI5LjIzNzdDMTIuOTk3NSAyOC41MTQyIDEyLjU5MzEgMjcuMjUxMSAxNC43NjExIDI3LjIxNjNDMjEuNTk0MSAyNy4xMTExIDIxLjQ2NDIgMjYuNjExNCAyMi42MzkyIDI4LjMwNDdDMjIuNjM5MiAyOC4zMDQ3IDM1LjY4MDQgNDMuNjcwMSA0Mi43NzMgNTAuMDgxNkM0OC45Njk1IDU1LjY4NDcgNTYuNjIzMSA1OS41ODMzIDYxLjU2NDcgNTkuODE3M0M2OC4yMzE2IDYwLjEyNyA3MS44MjQ4IDU5LjA0OTkgNzEuODI0OCA1OC4xODMzQzcxLjgyNDggNTYuNDUyMiA2Ni4wMDgzIDYxLjMyMjYgNTAuMTk0NSA0OS4xNDc2QzQwLjY0NzYgNDEuOCAyOC45MDE3IDI4LjAzMjggMjcuMDgwNiAyNS43NjYyQzI2LjkzMjcgMjUuNTg3NCAyNy4wOTU1IDI1LjQxNzggMjcuMDgwNiAyNS4zOTAyWk0xMy4wMDY1IDQuOTcyNUMxMy4wMDY1IDIuMTU3MTMgMTQuNjEyNSAyLjQ1ODYgMTcuMDUzIDIuNDU4NkMyMy42OTc2IDIuNDU4NiAzMC4zOTAxIDUuNjQxODUgMzAuMzkwMSAxNC40NDY2QzMwLjM5MDEgMjMuMzk2NSAyMy4zMDI3IDI0Ljc2MzggMjAuMzg4NiAyNC43NjM4QzE3LjIwMzEgMjQuNzYzOCAxMi45OTkgMjUuMTI0NiAxMi45OTkgMjMuNzU0MkwxMy4wMDY1IDQuOTcyNVoiCiAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjYuODg1IDUuMTI4OTEpIgogIC8+CjxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMjYuOTkyMyAyNS4yOTlDMzEuODM2MSAyMy4yNzg2IDM2LjkwNDQgMTguNTcxNyAzNi45MDQ0IDEyLjk0M0MzNi45MDQ0IC0wLjk4NjYyMyAyMC4xMDUxIDAuMDE1ODcxNiAxOC45OTUgMC4wMTU4NzE2QzE1LjM5NjUgMC4wMTU4NzE2IDExLjMxMjcgMC42NTk2NzUgNy4yOTcwNCAwLjY1OTY3NUMzLjc2NjY4IDAuNjU5Njc1IDIuNjMxMDUgMC4yODk3NDQgMS4zODQ3MiAwLjI4OTc0NEMwLjU1NDU1IDAuMjg5NzQ0IC0wLjAwNTI4NCAwLjcyMzAzNCAzLjc2MTI5ZS0wNSAxLjE1NjMyQzAuMDEwNjgwOCAzLjE3NTYyIDcuNTU5OTMgLTAuMDQ3NDg3MyA3LjQzNzUzIDcuNjU5NzZWNDQuMzk1NEM3LjQ2MDk1IDUwLjA1MTcgMy4zNDQxNCA0OS44NjM2IDEuOTA3MzEgNDkuODYzNkMwLjIyNzgwMyA0OS44NjM2IDIuNjU5NzggNTEuNDY1IDMuMDc0ODcgNTEuNDY1QzUuNzA0ODEgNTEuNDY1IDcuNzcxNzMgNTAuODA0OCAxMC40MDI3IDUwLjgwNDhDMTYuMTQ4IDUwLjgwNDggMjAuMDE2OCA1MS4zODQyIDIwLjYzMDkgNTEuNDg0NEMyMi4yMzI3IDUxLjc0NCAyMi41Mjc1IDUwLjU4ODIgMjAuOTg5NiA1MC4yNDE3QzE4LjUwNjUgNDkuNjc2NiAxMi45NTA3IDQ5LjczNzkgMTIuOTE4OCA0My43NTM2TDEyLjkwNiAyOS4yMzk0QzEyLjkwNiAyOC41MTcgMTIuNDkwOSAyNy4yMTkxIDE0LjcwNTggMjcuMjE5MUMyMi40NTgzIDI3LjIxOTEgMjEuODY0NCAyNi44NDYxIDI0LjM1NiAzMC44ODg4TDMyLjk0NjIgNDMuNjM2MUMzNS41NzgyIDQ3Ljc1MDMgMzguMjc2MyA1MS40MzAyIDQzLjMyOTcgNTEuNDMwMkM0My45NTM0IDUxLjQzMDIgNDguNzEwOSA1MS41MjIyIDQ4LjY2NzMgNTAuNjU1NkM0OC42MjI2IDQ5Ljc3ODggNDkuNTUwNyA0OS4yOTk1IDQ3LjUyMzEgNDkuNjEyMkM0NS44NjQ5IDQ5Ljg3MDggNDIuNjk1NCA0OC43MjUyIDM5LjQ1NDUgNDMuNTY0NkwyNi45NjA0IDI1LjczOTRDMjYuNzYzNSAyNS42MTI3IDI2Ljk5MjMgMjUuMjk5IDI2Ljk5MjMgMjUuMjk5Wk0xMy4wNDkzIDUuMDY3MTlDMTMuMDQ5MyAyLjI1Mzg3IDE0LjUwNTMgMi41MDUyNiAxNi45OTU4IDIuMzk2OTRDMjQuMjMyMiAyLjA4NTI2IDMwLjc2NzEgNS4zOTIxNiAzMC43NjcxIDE0LjE5NTlDMzAuNzY3MSAyMy4xNDQ4IDI0LjIwMjQgMjQuNzM3OSAyMS4yMjY1I" +
"DI0LjczNzlDMTcuOTcwNyAyNC43Mzc5IDEzLjA1NjggMjUuMTY5MiAxMy4wNTY4IDIzLjc5NzhMMTMuMDQ5MyA1LjA2NzE5WiIKICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgzLjE4MjEgNS4xMjY5NSkiCiAgLz4KPHBhdGgKICAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgIGNsaXAtcnVsZT0iZXZlbm9kZCIKICAgIGQ9Ik0zOC4xMTAyIDQyLjAxNDhDMzguODAzMSA0NC4wMTU3IDM5LjM5NDkgNDYuMzI5MyA0MC4wMjkyIDQ3LjgzODdDNDEuNDAyMiA1MS4xMDU3IDM3Ljg3NCA1Mi4yOTYzIDM2LjUwMiA1Mi4xNjk1QzM1LjM5MDkgNTIuMDY5NCAzNS42NTA2IDUzLjk4ODUgMzcuNjI0OSA1My42NDYyQzM5LjQ2NzIgNTMuMzI1MyA0MS44MTUxIDUzLjExMTcgNDMuNjkwNSA1My4xMTE3QzQ2LjUzMzMgNTMuMTExNyA0OC45MjggNTMuNjQ2MiA1MS43NzI5IDUzLjY0NjJDNTIuMjU2MSA1My42NDYyIDUzLjY4NzcgNTIuNDgzMyA1Mi40NDc3IDUyLjE2OTVDNTEuNTY4NiA1MS45NDg4IDQ4LjkxOTUgNTEuOTgwNSA0Ny4zMTY2IDQ5LjI1ODFDNDUuNzc1NSA0Ni42MzQ5IDQ0LjY5NzMgNDMuNjU2IDQzLjY1NjQgNDAuOTE0MkwyOC43NDg0IDIuNzQwNzZDMjguNTQwOSAyLjE0ODA2IDI4LjA1NTYgMCAyNy4yOTI0IDBDMjYuMzkyIDAgMjYuMTg0NSAxLjE4NTQyIDIyLjA5MzIgMTAuNTIxNkw1LjUxOTU4IDQ4LjMxMThDMy43MTQ0OSA1Mi41MzY0IDAgNTEuMTUzOCAwIDUyLjcxMDFDMCA1My4xNTU3IDAuNjY0MTM4IDUzLjY0NjIgMS4wODM0OCA1My42NDYyQzIuODg0MzIgNTMuNjQ2MiA0Ljk1NjU1IDUzLjE3NjEgNi44Mjc2MyA1My4xNzYxQzguNzcwMDMgNTMuMTc2MSAxMC43MTM1IDUzLjI0NzcgMTMuMjY2OCA1My42NTIzQzE0Ljk5ODQgNTMuOTI1MiAxNS40MDA4IDUyLjUwNzggMTMuODg4NCA1Mi4xNjk1QzExLjkyNzkgNTEuNzMxMSA4Ljk4NjA4IDUwLjg3NDggOS40MDExNyA0Ny42NDQ1QzkuOTY2MzIgNDMuMjU5NSAxMy45ODUyIDM1LjU3ODggMTMuOTg1MiAzNS41Nzg4QzE0LjY4MDIgMzQuMDI0NSAxNi4zMDEyIDMzLjUwODQgMTcuNjE2NyAzMy41MDg0SDMyLjg3NDhDMzQuODE1MSAzMy41MDg0IDM1LjE5NzIgMzQuMjMyIDM1Ljg5MjIgMzUuOTM3NUwzOC4xMTAyIDQyLjAxNDhaTTI1LjAwNzYgMTAuNTIwM0MyNS40MjI3IDkuNjMxMjUgMjUuNzY5NyA5LjYzMTI1IDI2LjExNjYgMTAuNTIwM0wzMy4zMzE3IDI5LjM4NzhDMzMuNjc4NyAzMC4zNTM1IDMzLjc0ODkgMzAuODcxNyAzMi4yMjE2IDMwLjg3MTdIMTcuNzEyN0MxNi44MTIzIDMwLjg3MTcgMTYuMzI0OSAzMC41NzUzIDE2LjgxMjMgMjkuNTM5MUwyNS4wMDc2IDEwLjUyMDNaIgogICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzUuMzMwMSAyLjk0NTMxKSIKICAvPgo8cGF0aAogICAgZmlsbC1ydWxlPSJldmVub2RkIgogICAgY2xpcC1ydWxlPSJldmVub2RkIgogICAgZD0iTTYuMjIzNzYgNDIuODUxOEM2LjIyMzc2IDQ4LjQ3NTMgMy43MTcyOCA0OS4xNDI2IDIuOTEwNTIgNDkuMzYyNEMxLjU5Mzk2IDQ5Ljc5MzYgMC4xNjY2OTggNDkuNDI2NyAwLjI5NDQxNyA1MC42Nzc2QzAuMzYzNTk4IDUxLjMyMzQgMi4xMjI5MiA1MS4yMTUxIDIuNDg3OTkgNTEuMjE1MUM1Ljg1NzY0IDUxLjIxNTEgNy45NzQ1OCA1MS4wNTU3IDExLjM0MjEgNTEuMDU1N0MxMy44MzA1IDUxLjA1NTcgMjAuMDE0MiA1MS42ODQxIDIyLjY0NzMgNTEuNjg0MUMzNi45MjEgNTEuNjg0MSAzOS45NTAxIDQxLjMyNzEgMzkuOTY4MSAzNS45MjczQzQwLjAwMDEgMjUuNjY1MyAyOC40NjYgMjQuMTQ4OCAyOC40NjYgMjMuMDY3NkMyOC40NjYgMjIuNTYzOCAzNS42NTQ0IDE5LjgyIDM1LjY1NDQgMTIuNDY0MkMzNS42NTQ0IDcuMTI1NzggMzIuMTMzNyAwLjE1NzM3NCAxOS4yNTExIDAuMTU3Mzc0QzEzLjM5NjIgMC4xNTczNzQgMTIuMjExNiAwLjY5MDgxMSA5LjI4MjYzIDAuNjkwODExQzYuMzU1NzQgMC42OTA4MTEgMi4yNTE3MSAwIDAuNzg4MjYzIDBDLT" +
"AuMDkwODY4NyAwIC0wLjUxODcyNyAwLjk0MDE1OCAxLjA0OTAyIDEuNTY5NjVDMi40MzU4NCAyLjEyNDU1IDYuMjIzNzYgMS44ODY0NSA2LjIyMzc2IDcuMzY3OTdWNDIuODUxOFpNMTEuNDg0NCAyNi4wNzg2QzExLjQ4NDQgMjUuNDI4NiAxMS4xMTgzIDI0LjQxOCAxNi43NTQ5IDI0LjQxOEMzMy41ODkzIDI0LjQxOCAzMy44ODIgMzMuOTc5IDMzLjg4MiAzOC41OTI5QzMzLjg4MiA0Mi45MTg2IDMyLjQxODYgNDkuNTcxMyAyMS4xNzgzIDQ5LjY5NTlDMTAuNzg2MiA0OS44MTE0IDExLjQ4NDQgNDcuNzUxMiAxMS40ODQ0IDQyLjU1NzlWMjYuMDc4NlpNMTEuNDg3NyA3Ljk0NUMxMS40ODc3IDMuNzYxMyAxMS4xMjM3IDIuNjI1OTUgMTUuNzMzMyAyLjUzMzk4QzI0LjU0OTEgMi4zNTkyMyAzMC43NzU0IDcuMDg0NTUgMzAuNTk1NSAxNC44NzA1QzMwLjQ5NTUgMTkuMTAxMiAyNy41ODg4IDIyLjc3NiAxNy45NDcxIDIyLjYyODhDMTEuMzYyMSAyMi41MjY2IDExLjQ4NzcgMjIuMTUyNiAxMS40ODc3IDE5Ljg0MjFWNy45NDVaIgogICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCA1LjQxNzk3KSIKICAvPgo8L3N2Zz4K\n" +
"Goldman Sachs analysts predict that the S&P 500 will have a 4.2% price gain and end at 4,700 by the end of 2024, representing a modest increase from recent levels. They believe that the U.S. economy will continue to expand at a modest pace and that earnings will rise by 5%. The forecast includes an equity market valuation at an 18 times multiple. Goldman Sachs also predicts that the 'Magnificent 7' bundle of mega-caps, including Nvidia, Microsoft, Alphabet, Apple, Amazon.com, Meta Platforms, and Tesla, will outperform the rest of the S&P 500 in 2024. They suggest that there are more attractive investment opportunities in quality stocks, growth stocks with high ROIC, and beaten-down cyclicals. According to Lombard Odier, the US economy is expected to experience a mild slowdown in 2024, leading to two interest rate cuts from the Federal Reserve. Despite slower but still positive nominal growth, corporate earnings growth is expected to remain positive into 2024, allowing room for US stocks to advance. The S&P 500's stock index has seen a rebound, supported by strong US consumer spending and cost cuts in the corporate sector. However, corporate profits in the US have already experienced a recession, recording three quarters of year-on-year declines. The article discusses the factors contributing to the apparent 'divergence' between corporate profits and the broader economy. The author expects the S&P 500 to finish 2024 around 4,800 points. The article also mentions the potential risks to the outlook for equities, including a classic economic recession in the US and the possibility of a more bullish environment with a faster recovery in US manufacturing. The article briefly touches on the relative performance of European and emerging markets. \n" +
"\n" +
"#GoldmanSachs #S&P500 #stockmarket #economy #earnings \n" +
"\n" +
"References:\n" +
"- Barrons: https://www.barrons.com/livecoverage/stock-market-today-111523/card/goldman-sees-4-2-rise-for-s-p-500-through-2024-as-u-s-avoids-recession-OmkU52x3hbSKJGcFBkyj\n" +
"- 8world: https://www.8world.com/finance/gang-says-icbc-paid-ransom-over-hack-2292621\n" +
"\n"
@Test
fun testShortPost() {
assertEquals(76, ExpandableTextCutOffCalculator.indexToCutOff(shortPost))
}
@Test
fun testLostPost() {
assertEquals(77, ExpandableTextCutOffCalculator.indexToCutOff(longPost))
}
}

Wyświetl plik

@ -24,6 +24,7 @@ class ExpandableTextCutOffCalculator {
companion object {
private const val SHORT_TEXT_LENGTH = 350
private const val SHORTEN_AFTER_LINES = 10
private const val TOO_FAR_SEACH_THE_OTHER_WAY = 450
fun indexToCutOff(content: String): Int {
// Cuts the text in the first space or new line after SHORT_TEXT_LENGTH characters
@ -34,7 +35,19 @@ class ExpandableTextCutOffCalculator {
val firstLineAfterLineLimits =
content.nthIndexOf('\n', SHORTEN_AFTER_LINES).let { if (it < 0) content.length else it }
return minOf(firstSpaceAfterCut, firstNewLineAfterCut, firstLineAfterLineLimits)
val min = minOf(firstSpaceAfterCut, firstNewLineAfterCut, firstLineAfterLineLimits)
if (min > TOO_FAR_SEACH_THE_OTHER_WAY) {
val newString = content.take(SHORT_TEXT_LENGTH)
val firstSpaceBeforeCut =
newString.lastIndexOf(' ').let { if (it < 0) content.length else it }
val firstNewLineBeforeCut =
newString.lastIndexOf('\n').let { if (it < 0) content.length else it }
return maxOf(firstSpaceBeforeCut, firstNewLineBeforeCut)
} else {
return min
}
}
}
}