Skip to content

Commit

Permalink
Handle Bib tests
Browse files Browse the repository at this point in the history
  • Loading branch information
DerDrodt committed Oct 16, 2024
1 parent 41ec702 commit ef2e59a
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 19 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ strum = { version = "0.26", features = ["derive"], optional = true }

[dev-dependencies]
heck = "0.5"
html_parser = "0.7"
serde_json = "1"

[[bin]]
Expand Down
86 changes: 86 additions & 0 deletions tests/citeproc-pass.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@ affix_InterveningEmpty
affix_TextNodeWithMacro
bugreports_Abnt
bugreports_ArabicLocale
bugreports_AsaSpacing
bugreports_AuthorYear
bugreports_BadCitationUpdate
bugreports_ByBy
bugreports_ChineseCharactersFamilyOnlyPluralLabel
bugreports_ContextualPluralWithMainItemFields
bugreports_EmptyIfMatchNoneFail
bugreports_MatchedAuthorAndDate
bugreports_SectionAndLocator
bugreports_SimpleBib
bugreports_SingletonIfMatchNoneFail
bugreports_TitleCase
bugreports_UndefinedInName2
bugreports_YearSuffixLingers
bugreports_disambiguate
bugreports_effingBug
Expand All @@ -40,18 +45,21 @@ condition_NameAndTextVars
condition_NumberIsNumeric
condition_NumeralIsNumeric
condition_NumeralWithTextIsNumeric
condition_RefTypeBranching
condition_SingletonIfMatchNone
condition_TextIsNotNumeric
condition_VariableAll
condition_VariableAny
condition_VariableNone
date_Accessed
date_AccessedCrash
date_DateAD
date_DateNoDateWithTest
date_DisappearingBug
date_EmptyStrings
date_IgnoreNonexistentSort
date_January
date_KeyVariable
date_LiteralFailGracefullyIfNoValue
date_LocalizedDateFormats-af-ZA
date_LocalizedDateFormats-ar-AR
Expand Down Expand Up @@ -109,6 +117,7 @@ date_LocalizedTextYearWithAffixes
date_LongMonth
date_MaskNonexistentWithCondition
date_NoDate
decorations_Baseline
decorations_SimpleQuotes
disambiguate_AddNamesSuccess
disambiguate_ByCiteGivennameNoShortFormInitializeWith
Expand All @@ -121,21 +130,26 @@ disambiguate_DifferentSpacingInInitials
disambiguate_DisambiguateTrueAndYearSuffixOne
disambiguate_FailWithYearSuffix
disambiguate_FamilyNameOnly
disambiguate_HonorFullnameInBibliography
disambiguate_ImplicitYearSuffixOnceOnly
disambiguate_LastOnlyFailWithByCite
disambiguate_NoTextElementUsesYearSuffixVariable
disambiguate_PrimaryNameWithNonDroppingParticle
disambiguate_ThreeNoAuthorNoTitleEntries
disambiguate_WithOriginalYear
disambiguate_YearCollapseWithInstitution
disambiguate_YearSuffixMacroSameYearExplicit
disambiguate_YearSuffixMacroSameYearImplicit
disambiguate_YearSuffixWithEtAlSubsequent
display_DisplayBlock
flipflop_OrphanQuote
form_TitleShort
form_TitleShortNoLong
form_TitleTestNoLongFalse
fullstyles_APA
group_ShortOutputOnly
group_SuppressValueWithEmptySubgroup
group_SuppressWithEmptyNestedDateNode
integration_CitationSort
integration_CitationSortTwice
label_CompactNamesAfterFullNames
Expand Down Expand Up @@ -192,9 +206,12 @@ name_CeltsAndToffsWithHyphens
name_CiteGroupDelimiterWithYearCollapse
name_CollapseRoleLabels
name_Delimiter
name_EditorTranslatorBoth
name_EditorTranslatorSameEmptyTerm
name_EditorTranslatorSameWithTerm
name_EditorTranslatorWithTranslatorOnlyBib
name_EtAlKanji
name_EtAlUseLast
name_FirstInitialFullForm
name_FormattingOfParticles
name_GreekSimple
Expand All @@ -206,6 +223,7 @@ name_InstitutionDecoration
name_LabelAfterPlural
name_LabelAfterPluralDecorations
name_LabelFormatBug
name_LiteralWithComma
name_NoNameNode
name_NonDroppingParticleDefault
name_OnlyFamilyname
Expand All @@ -215,6 +233,7 @@ name_PeriodAfterInitials
name_QuashOrdinaryVariableRenderedViaSubstitute
name_RomanianTwo
name_SemicolonWithAnd
name_SubsequentAuthorSubstituteMultipleNames
name_SubstituteMacroInheritDecorations
name_SubstituteName
name_SubstituteOnDateGroupSpanFail
Expand All @@ -229,48 +248,98 @@ name_WesternTwoAuthors
name_WithNonBreakingSpace
name_namepartAffixesNameAsSortOrder
name_namepartAffixesNameAsSortOrderDemoteNonDroppingParticle
nameattr_AndOnBibliographyInBibliography
nameattr_AndOnBibliographyInCitation
nameattr_AndOnCitationInBibliography
nameattr_AndOnCitationInCitation
nameattr_AndOnNamesInBibliography
nameattr_AndOnNamesInCitation
nameattr_AndOnStyleInBibliography
nameattr_AndOnStyleInCitation
nameattr_DelimiterPrecedesEtAlOnBibliographyInBibliography
nameattr_DelimiterPrecedesEtAlOnBibliographyInCitation
nameattr_DelimiterPrecedesEtAlOnCitationInBibliography
nameattr_DelimiterPrecedesEtAlOnCitationInCitation
nameattr_DelimiterPrecedesEtAlOnNamesInBibliography
nameattr_DelimiterPrecedesEtAlOnNamesInCitation
nameattr_DelimiterPrecedesEtAlOnStyleInBibliography
nameattr_DelimiterPrecedesEtAlOnStyleInCitation
nameattr_DelimiterPrecedesLastOnBibliographyInBibliography
nameattr_DelimiterPrecedesLastOnBibliographyInCitation
nameattr_DelimiterPrecedesLastOnCitationInBibliography
nameattr_DelimiterPrecedesLastOnCitationInCitation
nameattr_DelimiterPrecedesLastOnNamesInBibliography
nameattr_DelimiterPrecedesLastOnNamesInCitation
nameattr_DelimiterPrecedesLastOnStyleInBibliography
nameattr_DelimiterPrecedesLastOnStyleInCitation
nameattr_EtAlMinOnBibliographyInBibliography
nameattr_EtAlMinOnBibliographyInCitation
nameattr_EtAlMinOnCitationInBibliography
nameattr_EtAlMinOnCitationInCitation
nameattr_EtAlMinOnNamesInBibliography
nameattr_EtAlMinOnNamesInCitation
nameattr_EtAlMinOnStyleInBibliography
nameattr_EtAlMinOnStyleInCitation
nameattr_EtAlSubsequentMinOnBibliographyInBibliography
nameattr_EtAlSubsequentMinOnBibliographyInCitation
nameattr_EtAlSubsequentMinOnCitationInBibliography
nameattr_EtAlSubsequentMinOnNamesInBibliography
nameattr_EtAlSubsequentMinOnStyleInBibliography
nameattr_EtAlSubsequentUseFirstOnBibliographyInBibliography
nameattr_EtAlSubsequentUseFirstOnBibliographyInCitation
nameattr_EtAlSubsequentUseFirstOnCitationInBibliography
nameattr_EtAlSubsequentUseFirstOnStyleInBibliography
nameattr_EtAlUseFirstOnBibliographyInBibliography
nameattr_EtAlUseFirstOnBibliographyInCitation
nameattr_EtAlUseFirstOnCitationInBibliography
nameattr_EtAlUseFirstOnCitationInCitation
nameattr_EtAlUseFirstOnNamesInBibliography
nameattr_EtAlUseFirstOnNamesInCitation
nameattr_EtAlUseFirstOnStyleInBibliography
nameattr_EtAlUseFirstOnStyleInCitation
nameattr_InitializeWithOnBibliographyInBibliography
nameattr_InitializeWithOnBibliographyInCitation
nameattr_InitializeWithOnCitationInBibliography
nameattr_InitializeWithOnCitationInCitation
nameattr_InitializeWithOnNamesInBibliography
nameattr_InitializeWithOnNamesInCitation
nameattr_InitializeWithOnStyleInBibliography
nameattr_InitializeWithOnStyleInCitation
nameattr_NameAsSortOrderOnBibliographyInBibliography
nameattr_NameAsSortOrderOnBibliographyInCitation
nameattr_NameAsSortOrderOnCitationInBibliography
nameattr_NameAsSortOrderOnCitationInCitation
nameattr_NameAsSortOrderOnNamesInBibliography
nameattr_NameAsSortOrderOnNamesInCitation
nameattr_NameAsSortOrderOnStyleInBibliography
nameattr_NameAsSortOrderOnStyleInCitation
nameattr_NameDelimiterOnBibliographyInBibliography
nameattr_NameDelimiterOnBibliographyInCitation
nameattr_NameDelimiterOnCitationInBibliography
nameattr_NameDelimiterOnCitationInCitation
nameattr_NameDelimiterOnNamesInBibliography
nameattr_NameDelimiterOnNamesInCitation
nameattr_NameDelimiterOnStyleInBibliography
nameattr_NameDelimiterOnStyleInCitation
nameattr_NameFormOnBibliographyInBibliography
nameattr_NameFormOnBibliographyInCitation
nameattr_NameFormOnCitationInBibliography
nameattr_NameFormOnCitationInCitation
nameattr_NameFormOnNamesInBibliography
nameattr_NameFormOnNamesInCitation
nameattr_NameFormOnStyleInBibliography
nameattr_NameFormOnStyleInCitation
nameattr_NamesDelimiterOnBibliographyInCitation
nameattr_NamesDelimiterOnCitationInBibliography
nameattr_NamesDelimiterOnNamesInBibliography
nameattr_NamesDelimiterOnNamesInCitation
nameattr_SortSeparatorOnBibliographyInBibliography
nameattr_SortSeparatorOnBibliographyInCitation
nameattr_SortSeparatorOnCitationInBibliography
nameattr_SortSeparatorOnCitationInCitation
nameattr_SortSeparatorOnNamesInBibliography
nameattr_SortSeparatorOnNamesInCitation
nameattr_SortSeparatorOnStyleInBibliography
nameattr_SortSeparatorOnStyleInCitation
nameorder_Long
nameorder_LongNameAsSortDemoteDisplayAndSort
Expand All @@ -279,6 +348,7 @@ nameorder_Short
nameorder_ShortDemoteDisplayAndSort
nameorder_ShortNameAsSortDemoteNever
namespaces_NonNada3
number_FailingDelimiters
number_IsNumericWithAlpha
number_MixedPageRange
number_PageFirst
Expand All @@ -294,22 +364,38 @@ page_NumberPageFirst
page_PluralDetectWithEndash
page_WithLocaleAndWeirdDelimiter
plural_LabelForced
position_IbidWithSuffix
position_NearNoteUnsupported
position_TrueInCitation
punctuation_DateStripPeriods
punctuation_DelimiterWithStripPeriodsAndSubstitute1
punctuation_DelimiterWithStripPeriodsAndSubstitute2
punctuation_DelimiterWithStripPeriodsAndSubstitute3
punctuation_DoNotSuppressColonAfterPeriod
punctuation_NoSuppressOfPeriodBeforeSemicolon
quotes_Punctuation
sort_BibliographyResortOnUpdate
sort_CaseInsensitiveBibliography
sort_CaseInsensitiveCitation
sort_Citation
sort_CitationNumberPrimaryAscendingViaMacroBibliography
sort_CitationNumberPrimaryAscendingViaVariableBibliography
sort_CitationSecondaryKey
sort_CiteGroupDelimiter
sort_DaleDalebout
sort_DateVariable
sort_DateVariableMixedElementsAscendingA
sort_DateVariableMixedElementsAscendingB
sort_DateVariableMixedElementsDescendingA
sort_DateVariableMixedElementsDescendingB
sort_EtAlUseLast
sort_FamilyOnly
sort_LatinUnicode
sort_LocalizedDateLimitedParts
sort_NameParticleInNameSortFalse
sort_NameParticleInNameSortTrue
sort_NamesUseLast
sort_StatusFieldDescending
sort_TestInheritance
sortseparator_SortSeparatorEmpty
substitute_RepeatedNamesOk
Expand Down
86 changes: 67 additions & 19 deletions tests/citeproc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use hayagriva::{
BibliographyDriver, BibliographyRequest, CitationItem, CitationRequest, CitePurpose,
Entry, LocatorPayload, SpecificLocator,
};
use html_parser::{Dom, Element, Node};
use unscanny::Scanner;

const TEST_REPO_NAME: &str = "test-suite";
Expand Down Expand Up @@ -270,14 +271,20 @@ impl<'s> TestCaseBuilder<'s> {
}

fn finish(self) -> Result<TestCase, TestParseError> {
let mode = self
.mode
.ok_or(TestParseError::MissingRequiredSection(SectionTag::Mode))?;
let result = self
.result
.ok_or(TestParseError::MissingRequiredSection(SectionTag::Result))?
.replace("&#38;", "&");
Ok(TestCase {
mode: self
.mode
.ok_or(TestParseError::MissingRequiredSection(SectionTag::Mode))?,
result: self
.result
.ok_or(TestParseError::MissingRequiredSection(SectionTag::Result))?
.replace("&#38;", "&"),
mode,
result: if mode == TestMode::Bibliography && result.starts_with("<div") {
extract_from_html(&result)
} else {
result
},
csl: Style::from_xml(
self.csl
.ok_or(TestParseError::MissingRequiredSection(SectionTag::Csl))?,
Expand All @@ -303,6 +310,37 @@ impl<'s> TestCaseBuilder<'s> {
}
}

fn extract_from_html(html: &str) -> String {
let mut res = String::new();
let dom = Dom::parse(html).expect("Could not parse HTML");
assert_eq!(1, dom.children.len());
let node = &dom.children[0];
let mut item = String::new();
for child in node.into_iter() {
match child {
Node::Element(Element { name, classes, .. })
if name == "div"
&& classes.get(0).map(|c| c == "csl-entry").unwrap_or(false) =>
{
if !item.is_empty() {
res.push_str(&item);
res.push('\n');
item = String::new();
}
}
Node::Text(s) => item.push_str(s),
_ => {}
}
}

if !item.is_empty() {
res.push_str(&item);
item = String::new();
}

res
}

#[test]
fn test_parse_tests() {
let mut results = TestSuiteResults::obtain();
Expand Down Expand Up @@ -489,12 +527,7 @@ where
.map_or(false, |d| d.end.is_some())
});

if case.mode == TestMode::Bibliography {
if print {
eprintln!("Skipping test {}\t(cause: Bibliography mode)", display());
}
false
} else if !can_test {
if !can_test {
if print {
eprintln!("Skipping test {}\t(cause: unsupported test feature)", display());
}
Expand Down Expand Up @@ -577,12 +610,27 @@ where

let rendered = driver.finish(BibliographyRequest::new(&style, None, locales));

for citation in rendered.citations {
citation
.citation
.write_buf(&mut output, hayagriva::BufWriteFormat::Plain)
.unwrap();
output.push('\n');
match case.mode {
TestMode::Citation => {
for citation in rendered.citations {
citation
.citation
.write_buf(&mut output, hayagriva::BufWriteFormat::Plain)
.unwrap();
output.push('\n');
}
}
TestMode::Bibliography => {
let bib = rendered
.bibliography
.expect("Bibliography mode test but no bibliography was rendered");
for item in bib.items {
item.content
.write_buf(&mut output, hayagriva::BufWriteFormat::Plain)
.unwrap();
output.push('\n');
}
}
}

if output.trim() == case.result.trim() {
Expand Down

0 comments on commit ef2e59a

Please sign in to comment.