mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-05-31 20:24:27 -04:00
* Updated a typo in manage tasks of Reoccuring -> Recurring * Fixed a bug in MinimumNumberFromRange where a regex wasn't properly constructed which could skew results. * Fixed a bug where Volume numbers that were a float wouldn't render correctly in the manga reader menu. * Added the ability to double click on the image to bookmark it. Optimized the bookmark and unbookmark flows to remove 2 DB calls and reworked some flow of calls to speed it up. Fixed some logic where when using double (manga) flow, both of the images wouldn't show the bookmark effect, despite both of them being saved. Likewise, fixed a bug where both images weren't updating UI state, so switching from double (manga) to single, the second image wouldn't show as bookmarked without a refresh. * Double click works perfectly for bookmarking * Collection cover image chooser will now prompt with all series covers by default. Reset button is now moved up to the first slot if applicable. * When a Completed series is fully read by a user, a nightly task will now remove that series from their Want to Read list. * Added ability to trigger Want to Read cleanup from Tasks page. * Moved the brightness readout to the label line and fixed a bootstrap migration bug where small buttons weren't actually small. * Implemented ability to filter against release year (min or max or both). * Fixed a log message that wasn't properly formatted when scan finished an no files changes. * Cleaned up some code and merged some methods * Implemented sort by Release year metadata filter. * Fixed the code that finds ComicInfo.xml inside archives to only check the root and check explicitly for casing, so it must be ComicInfo.xml. * Dependency updates * Refactored some strings into consts and used TriggerJob rather than just enqueuing * Fixed the prefetcher which wasn't properly loading in the correct order as it was designed. * Cleaned up all traces of CircularArray from MangaReader * Removed a debug code * Fixed a bug with webtoon reader in fullscreen mode where continuous reader wouldn't trigger * When cleaning up series from users' want to read lists, include both completed and cancelled. * Fixed a bug where small images wouldn't have the pagination area extend to the bottom on manga reader * Added a new method for hashing during prod builds and ensure we always use aot * Fixed a bug where the save button wouldn't enable when color change occured. * Cleaned up some issues in one of contributor's PR.
240 lines
8.5 KiB
C#
240 lines
8.5 KiB
C#
using System.Linq;
|
|
using Xunit;
|
|
using static API.Services.Tasks.Scanner.Parser.Parser;
|
|
|
|
namespace API.Tests.Parser;
|
|
|
|
public class ParserTests
|
|
{
|
|
[Theory]
|
|
[InlineData("Joe Shmo, Green Blue", "Joe Shmo, Green Blue")]
|
|
[InlineData("Shmo, Joe", "Shmo, Joe")]
|
|
[InlineData(" Joe Shmo ", "Joe Shmo")]
|
|
public void CleanAuthorTest(string input, string expected)
|
|
{
|
|
Assert.Equal(expected, CleanAuthor(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("", "")]
|
|
[InlineData("DEAD Tube Prologue", "DEAD Tube Prologue")]
|
|
[InlineData("DEAD Tube Prologue SP01", "DEAD Tube Prologue")]
|
|
[InlineData("DEAD_Tube_Prologue SP01", "DEAD Tube Prologue")]
|
|
public void CleanSpecialTitleTest(string input, string expected)
|
|
{
|
|
Assert.Equal(expected, CleanSpecialTitle(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("Beastars - SP01", true)]
|
|
[InlineData("Beastars SP01", true)]
|
|
[InlineData("Beastars Special 01", false)]
|
|
[InlineData("Beastars Extra 01", false)]
|
|
[InlineData("Batman Beyond - Return of the Joker (2001) SP01", true)]
|
|
public void HasSpecialTest(string input, bool expected)
|
|
{
|
|
Assert.Equal(expected, HasSpecialMarker(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("0001", "1")]
|
|
[InlineData("1", "1")]
|
|
[InlineData("0013", "13")]
|
|
public void RemoveLeadingZeroesTest(string input, string expected)
|
|
{
|
|
Assert.Equal(expected, RemoveLeadingZeroes(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("1", "001")]
|
|
[InlineData("10", "010")]
|
|
[InlineData("100", "100")]
|
|
public void PadZerosTest(string input, string expected)
|
|
{
|
|
Assert.Equal(expected, PadZeros(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("Hello_I_am_here", false, "Hello I am here")]
|
|
[InlineData("Hello_I_am_here ", false, "Hello I am here")]
|
|
[InlineData("[ReleaseGroup] The Title", false, "The Title")]
|
|
[InlineData("[ReleaseGroup]_The_Title", false, "The Title")]
|
|
[InlineData("-The Title", false, "The Title")]
|
|
[InlineData("- The Title", false, "The Title")]
|
|
[InlineData("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.1", false, "Kasumi Otoko no Ko v1.1")]
|
|
[InlineData("Batman - Detective Comics - Rebirth Deluxe Edition Book 04 (2019) (digital) (Son of Ultron-Empire)", true, "Batman - Detective Comics - Rebirth Deluxe Edition")]
|
|
[InlineData("Something - Full Color Edition", false, "Something - Full Color Edition")]
|
|
public void CleanTitleTest(string input, bool isComic, string expected)
|
|
{
|
|
Assert.Equal(expected, CleanTitle(input, isComic));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("src: url(fonts/AvenirNext-UltraLight.ttf)", true)]
|
|
[InlineData("src: url(ideal-sans-serif.woff)", true)]
|
|
[InlineData("src: local(\"Helvetica Neue Bold\")", true)]
|
|
[InlineData("src: url(\"/fonts/OpenSans-Regular-webfont.woff2\")", true)]
|
|
[InlineData("src: local(\"/fonts/OpenSans-Regular-webfont.woff2\")", true)]
|
|
[InlineData("src: url(data:application/x-font-woff", false)]
|
|
public void FontCssRewriteMatches(string input, bool expectedMatch)
|
|
{
|
|
Assert.Equal(expectedMatch, FontSrcUrlRegex.Matches(input).Count > 0);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("src: url(fonts/AvenirNext-UltraLight.ttf)", new [] {"src: url(", "fonts/AvenirNext-UltraLight.ttf", ")"})]
|
|
[InlineData("src: url(ideal-sans-serif.woff)", new [] {"src: url(", "ideal-sans-serif.woff", ")"})]
|
|
[InlineData("src: local(\"Helvetica Neue Bold\")", new [] {"src: local(\"", "Helvetica Neue Bold", "\")"})]
|
|
[InlineData("src: url(\"/fonts/OpenSans-Regular-webfont.woff2\")", new [] {"src: url(\"", "/fonts/OpenSans-Regular-webfont.woff2", "\")"})]
|
|
[InlineData("src: local(\"/fonts/OpenSans-Regular-webfont.woff2\")", new [] {"src: local(\"", "/fonts/OpenSans-Regular-webfont.woff2", "\")"})]
|
|
public void FontCssCorrectlySeparates(string input, string[] expected)
|
|
{
|
|
Assert.Equal(expected, FontSrcUrlRegex.Match(input).Groups.Values.Select(g => g.Value).Where((_, i) => i > 0).ToArray());
|
|
}
|
|
|
|
|
|
[Theory]
|
|
[InlineData("test.cbz", true)]
|
|
[InlineData("test.cbr", true)]
|
|
[InlineData("test.zip", true)]
|
|
[InlineData("test.rar", true)]
|
|
[InlineData("test.rar.!qb", false)]
|
|
[InlineData("[shf-ma-khs-aqs]negi_pa_vol15007.jpg", false)]
|
|
public void IsArchiveTest(string input, bool expected)
|
|
{
|
|
Assert.Equal(expected, IsArchive(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("test.epub", true)]
|
|
[InlineData("test.pdf", true)]
|
|
[InlineData("test.mobi", false)]
|
|
[InlineData("test.djvu", false)]
|
|
[InlineData("test.zip", false)]
|
|
[InlineData("test.rar", false)]
|
|
[InlineData("test.epub.!qb", false)]
|
|
[InlineData("[shf-ma-khs-aqs]negi_pa_vol15007.ebub", false)]
|
|
public void IsBookTest(string input, bool expected)
|
|
{
|
|
Assert.Equal(expected, IsBook(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("test.epub", true)]
|
|
[InlineData("test.EPUB", true)]
|
|
[InlineData("test.mobi", false)]
|
|
[InlineData("test.epub.!qb", false)]
|
|
[InlineData("[shf-ma-khs-aqs]negi_pa_vol15007.ebub", false)]
|
|
public void IsEpubTest(string input, bool expected)
|
|
{
|
|
Assert.Equal(expected, IsEpub(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("12-14", 12)]
|
|
[InlineData("24", 24)]
|
|
[InlineData("18-04", 4)]
|
|
[InlineData("18-04.5", 4.5)]
|
|
[InlineData("40", 40)]
|
|
[InlineData("40a-040b", 0)]
|
|
[InlineData("40.1_a", 0)]
|
|
[InlineData("3.5", 3.5)]
|
|
[InlineData("3.5-4.0", 3.5)]
|
|
[InlineData("asdfasdf", 0.0)]
|
|
public void MinimumNumberFromRangeTest(string input, float expected)
|
|
{
|
|
Assert.Equal(expected, MinNumberFromRange(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("12-14", 14)]
|
|
[InlineData("24", 24)]
|
|
[InlineData("18-04", 18)]
|
|
[InlineData("18-04.5", 18)]
|
|
[InlineData("40", 40)]
|
|
[InlineData("40a-040b", 0)]
|
|
[InlineData("40.1_a", 0)]
|
|
[InlineData("3.5", 3.5)]
|
|
[InlineData("3.5-4.0", 4.0)]
|
|
[InlineData("asdfasdf", 0.0)]
|
|
public void MaximumNumberFromRangeTest(string input, float expected)
|
|
{
|
|
Assert.Equal(expected, MaxNumberFromRange(input));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("Darker Than Black", "darkerthanblack")]
|
|
[InlineData("Darker Than Black - Something", "darkerthanblacksomething")]
|
|
[InlineData("Darker Than_Black", "darkerthanblack")]
|
|
[InlineData("Citrus", "citrus")]
|
|
[InlineData("Citrus+", "citrus+")]
|
|
[InlineData("Again", "again")]
|
|
[InlineData("카비타", "카비타")]
|
|
[InlineData("06", "06")]
|
|
[InlineData("", "")]
|
|
public void NormalizeTest(string input, string expected)
|
|
{
|
|
Assert.Equal(expected, Normalize(input));
|
|
}
|
|
|
|
|
|
|
|
[Theory]
|
|
[InlineData("test.jpg", true)]
|
|
[InlineData("test.jpeg", true)]
|
|
[InlineData("test.png", true)]
|
|
[InlineData(".test.jpg", false)]
|
|
[InlineData("!test.jpg", true)]
|
|
[InlineData("test.webp", true)]
|
|
[InlineData("test.gif", true)]
|
|
public void IsImageTest(string filename, bool expected)
|
|
{
|
|
Assert.Equal(expected, IsImage(filename));
|
|
}
|
|
|
|
|
|
|
|
[Theory]
|
|
[InlineData("Love Hina - Special.jpg", false)]
|
|
[InlineData("folder.jpg", true)]
|
|
[InlineData("DearS_v01_cover.jpg", true)]
|
|
[InlineData("DearS_v01_covers.jpg", false)]
|
|
[InlineData("!cover.jpg", true)]
|
|
[InlineData("cover.jpg", true)]
|
|
[InlineData("cover.png", true)]
|
|
[InlineData("ch1/cover.png", true)]
|
|
[InlineData("ch1/backcover.png", false)]
|
|
[InlineData("backcover.png", false)]
|
|
[InlineData("back_cover.png", false)]
|
|
public void IsCoverImageTest(string inputPath, bool expected)
|
|
{
|
|
Assert.Equal(expected, IsCoverImage(inputPath));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("__MACOSX/Love Hina - Special.jpg", true)]
|
|
[InlineData("TEST/Love Hina - Special.jpg", false)]
|
|
[InlineData("__macosx/Love Hina/", false)]
|
|
[InlineData("MACOSX/Love Hina/", false)]
|
|
[InlineData("._Love Hina/Love Hina/", true)]
|
|
[InlineData("@Recently-Snapshot/Love Hina/", true)]
|
|
[InlineData("@recycle/Love Hina/", true)]
|
|
[InlineData("E:/Test/__MACOSX/Love Hina/", true)]
|
|
public void HasBlacklistedFolderInPathTest(string inputPath, bool expected)
|
|
{
|
|
Assert.Equal(expected, HasBlacklistedFolderInPath(inputPath));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("/manga/1/1/1", "/manga/1/1/1")]
|
|
[InlineData("/manga/1/1/1.jpg", "/manga/1/1/1.jpg")]
|
|
[InlineData(@"/manga/1/1\1.jpg", @"/manga/1/1/1.jpg")]
|
|
[InlineData("/manga/1/1//1", "/manga/1/1/1")]
|
|
[InlineData("/manga/1\\1\\1", "/manga/1/1/1")]
|
|
[InlineData("C:/manga/1\\1\\1.jpg", "C:/manga/1/1/1.jpg")]
|
|
public void NormalizePathTest(string inputPath, string expected)
|
|
{
|
|
Assert.Equal(expected, NormalizePath(inputPath));
|
|
}
|
|
}
|