Merge branch 'test_combinations'
This commit is contained in:
commit
13697df7ea
27
build.rs
27
build.rs
@ -19,8 +19,6 @@ fn main() {
|
|||||||
// Re-generate the tests if any org-mode files change
|
// Re-generate the tests if any org-mode files change
|
||||||
println!("cargo:rerun-if-changed=org_mode_samples");
|
println!("cargo:rerun-if-changed=org_mode_samples");
|
||||||
|
|
||||||
write_header(&mut test_file);
|
|
||||||
|
|
||||||
let test_files = WalkDir::new("org_mode_samples")
|
let test_files = WalkDir::new("org_mode_samples")
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|e| match e {
|
.filter(|e| match e {
|
||||||
@ -54,28 +52,15 @@ fn write_test(test_file: &mut File, test: &walkdir::DirEntry) {
|
|||||||
.strip_suffix(".org")
|
.strip_suffix(".org")
|
||||||
.expect("Should have .org extension")
|
.expect("Should have .org extension")
|
||||||
.replace("/", "_");
|
.replace("/", "_");
|
||||||
let test_name = format!("autogen_{}", test_name);
|
|
||||||
|
|
||||||
if let Some(_reason) = is_expect_fail(test_name.as_str()) {
|
|
||||||
write!(test_file, "#[ignore]\n").unwrap();
|
|
||||||
}
|
|
||||||
write!(
|
write!(
|
||||||
test_file,
|
test_file,
|
||||||
include_str!("./tests/test_template"),
|
include_str!("./tests/test_template"),
|
||||||
name = test_name,
|
name = test_name,
|
||||||
path = test.path().display()
|
path = test.path().display(),
|
||||||
)
|
expect_fail = is_expect_fail(test_name.as_str())
|
||||||
.unwrap();
|
.map(|_| "#[ignore]\n")
|
||||||
}
|
.unwrap_or("")
|
||||||
|
|
||||||
#[cfg(feature = "compare")]
|
|
||||||
fn write_header(test_file: &mut File) {
|
|
||||||
write!(
|
|
||||||
test_file,
|
|
||||||
r#"
|
|
||||||
#[feature(exit_status_error)]
|
|
||||||
|
|
||||||
"#
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
@ -83,8 +68,8 @@ fn write_header(test_file: &mut File) {
|
|||||||
#[cfg(feature = "compare")]
|
#[cfg(feature = "compare")]
|
||||||
fn is_expect_fail(name: &str) -> Option<&str> {
|
fn is_expect_fail(name: &str) -> Option<&str> {
|
||||||
match name {
|
match name {
|
||||||
"autogen_greater_element_drawer_drawer_with_headline_inside" => Some("Apparently lines with :end: become their own paragraph. This odd behavior needs to be investigated more."),
|
"greater_element_drawer_drawer_with_headline_inside" => Some("Apparently lines with :end: become their own paragraph. This odd behavior needs to be investigated more."),
|
||||||
"autogen_element_container_priority_footnote_definition_dynamic_block" => Some("Apparently broken begin lines become their own paragraph."),
|
"element_container_priority_footnote_definition_dynamic_block" => Some("Apparently broken begin lines become their own paragraph."),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
7
notes/test_names.org
Normal file
7
notes/test_names.org
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
* Autogen tests
|
||||||
|
The autogen tests are the tests automatically generated to compare the output of Organic vs the upstream Emacs Org-mode parser using the sample documents in the =org_mode_samples= folder. They will have a prefix based on the settings for each test.
|
||||||
|
|
||||||
|
- default :: The test is run with the default settings (The upstream Emacs Org-mode determines the default settings)
|
||||||
|
- la :: Short for "list alphabetic". Enables alphabetic plain lists.
|
||||||
|
- t# :: Sets the tab-width to # (as in t4 sets the tab-width to 4).
|
||||||
|
- odd :: Sets the org-odd-levels-only setting to true (meaning "odd" as opposed to "oddeven").
|
@ -0,0 +1,22 @@
|
|||||||
|
# An ordered list starting at 3
|
||||||
|
1. [@3] foo
|
||||||
|
|
||||||
|
|
||||||
|
# An ordered list starting at 11
|
||||||
|
1. [@D] bar
|
||||||
|
|
||||||
|
|
||||||
|
# An ordered list starting at 1 with the contents of "[@kk] baz"
|
||||||
|
1. [@kk] baz
|
||||||
|
|
||||||
|
|
||||||
|
# A paragraph when org-list-allow-alphabetical is nil
|
||||||
|
m. lorem
|
||||||
|
|
||||||
|
|
||||||
|
# A paragraph when org-list-allow-alphabetical is nil
|
||||||
|
m. [@k] ipsum
|
||||||
|
|
||||||
|
|
||||||
|
# An unordered list with :counter set to 3
|
||||||
|
- [@3] dolar
|
@ -0,0 +1,30 @@
|
|||||||
|
# Alphabetic lists larger than 26 elements should become numbered. From M-x describe-variable org-list-allow-alphabetical:
|
||||||
|
#
|
||||||
|
# > Lists with more than 26 items will fallback to standard numbering.
|
||||||
|
a. 1
|
||||||
|
a. 2
|
||||||
|
a. 3
|
||||||
|
a. 4
|
||||||
|
a. 5
|
||||||
|
a. 6
|
||||||
|
a. 7
|
||||||
|
a. 8
|
||||||
|
a. 9
|
||||||
|
a. 10
|
||||||
|
a. 11
|
||||||
|
a. 12
|
||||||
|
a. 13
|
||||||
|
a. 14
|
||||||
|
a. 15
|
||||||
|
a. 16
|
||||||
|
a. 17
|
||||||
|
a. 18
|
||||||
|
a. 19
|
||||||
|
a. 20
|
||||||
|
a. 21
|
||||||
|
a. 22
|
||||||
|
a. 23
|
||||||
|
a. 24
|
||||||
|
a. 25
|
||||||
|
a. 26
|
||||||
|
a. 27
|
@ -0,0 +1,5 @@
|
|||||||
|
# "lorem" is prefixed by a tab instead of spaces, so the editor's tab-width value determines whether lorem is a sibling of baz (tab-width 8), a sibling of bar (tab-width < 8), or a child of baz (tab-width > 8).
|
||||||
|
1. foo
|
||||||
|
1. bar
|
||||||
|
1. baz
|
||||||
|
1. lorem
|
@ -6,21 +6,31 @@ use crate::compare::parse::emacs_parse_file_org_document;
|
|||||||
use crate::compare::parse::get_emacs_version;
|
use crate::compare::parse::get_emacs_version;
|
||||||
use crate::compare::parse::get_org_mode_version;
|
use crate::compare::parse::get_org_mode_version;
|
||||||
use crate::compare::sexp::sexp;
|
use crate::compare::sexp::sexp;
|
||||||
use crate::parser::parse;
|
use crate::context::GlobalSettings;
|
||||||
|
use crate::context::LocalFileAccessInterface;
|
||||||
use crate::parser::parse_with_settings;
|
use crate::parser::parse_with_settings;
|
||||||
use crate::GlobalSettings;
|
|
||||||
use crate::LocalFileAccessInterface;
|
|
||||||
|
|
||||||
pub fn run_anonymous_compare<P: AsRef<str>>(
|
pub fn run_anonymous_compare<P: AsRef<str>>(
|
||||||
org_contents: P,
|
org_contents: P,
|
||||||
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
run_anonymous_compare_with_settings(org_contents, &GlobalSettings::default())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run_compare_on_file<P: AsRef<Path>>(org_path: P) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
run_compare_on_file_with_settings(org_path, &GlobalSettings::default())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run_anonymous_compare_with_settings<P: AsRef<str>>(
|
||||||
|
org_contents: P,
|
||||||
|
global_settings: &GlobalSettings,
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// TODO: This is a work-around to pretend that dos line endings do not exist. It would be better to handle the difference in line endings.
|
// TODO: This is a work-around to pretend that dos line endings do not exist. It would be better to handle the difference in line endings.
|
||||||
let org_contents = org_contents.as_ref().replace("\r\n", "\n");
|
let org_contents = org_contents.as_ref().replace("\r\n", "\n");
|
||||||
let org_contents = org_contents.as_str();
|
let org_contents = org_contents.as_str();
|
||||||
eprintln!("Using emacs version: {}", get_emacs_version()?.trim());
|
eprintln!("Using emacs version: {}", get_emacs_version()?.trim());
|
||||||
eprintln!("Using org-mode version: {}", get_org_mode_version()?.trim());
|
eprintln!("Using org-mode version: {}", get_org_mode_version()?.trim());
|
||||||
let rust_parsed = parse(org_contents)?;
|
let rust_parsed = parse_with_settings(org_contents, global_settings)?;
|
||||||
let org_sexp = emacs_parse_anonymous_org_document(org_contents)?;
|
let org_sexp = emacs_parse_anonymous_org_document(org_contents, global_settings)?;
|
||||||
let (_remaining, parsed_sexp) = sexp(org_sexp.as_str()).map_err(|e| e.to_string())?;
|
let (_remaining, parsed_sexp) = sexp(org_sexp.as_str()).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
println!("{}\n\n\n", org_contents);
|
println!("{}\n\n\n", org_contents);
|
||||||
@ -38,7 +48,10 @@ pub fn run_anonymous_compare<P: AsRef<str>>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_compare_on_file<P: AsRef<Path>>(org_path: P) -> Result<(), Box<dyn std::error::Error>> {
|
pub fn run_compare_on_file_with_settings<P: AsRef<Path>>(
|
||||||
|
org_path: P,
|
||||||
|
global_settings: &GlobalSettings,
|
||||||
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let org_path = org_path.as_ref();
|
let org_path = org_path.as_ref();
|
||||||
eprintln!("Using emacs version: {}", get_emacs_version()?.trim());
|
eprintln!("Using emacs version: {}", get_emacs_version()?.trim());
|
||||||
eprintln!("Using org-mode version: {}", get_org_mode_version()?.trim());
|
eprintln!("Using org-mode version: {}", get_org_mode_version()?.trim());
|
||||||
@ -53,12 +66,12 @@ pub fn run_compare_on_file<P: AsRef<Path>>(org_path: P) -> Result<(), Box<dyn st
|
|||||||
working_directory: Some(parent_directory.to_path_buf()),
|
working_directory: Some(parent_directory.to_path_buf()),
|
||||||
};
|
};
|
||||||
let global_settings = {
|
let global_settings = {
|
||||||
let mut global_settings = GlobalSettings::default();
|
let mut global_settings = global_settings.clone();
|
||||||
global_settings.file_access = &file_access_interface;
|
global_settings.file_access = &file_access_interface;
|
||||||
global_settings
|
global_settings
|
||||||
};
|
};
|
||||||
let rust_parsed = parse_with_settings(org_contents, &global_settings)?;
|
let rust_parsed = parse_with_settings(org_contents, &global_settings)?;
|
||||||
let org_sexp = emacs_parse_file_org_document(org_path)?;
|
let org_sexp = emacs_parse_file_org_document(org_path, &global_settings)?;
|
||||||
let (_remaining, parsed_sexp) = sexp(org_sexp.as_str()).map_err(|e| e.to_string())?;
|
let (_remaining, parsed_sexp) = sexp(org_sexp.as_str()).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
println!("{}\n\n\n", org_contents);
|
println!("{}\n\n\n", org_contents);
|
||||||
|
@ -5,4 +5,6 @@ mod parse;
|
|||||||
mod sexp;
|
mod sexp;
|
||||||
mod util;
|
mod util;
|
||||||
pub use compare::run_anonymous_compare;
|
pub use compare::run_anonymous_compare;
|
||||||
|
pub use compare::run_anonymous_compare_with_settings;
|
||||||
pub use compare::run_compare_on_file;
|
pub use compare::run_compare_on_file;
|
||||||
|
pub use compare::run_compare_on_file_with_settings;
|
||||||
|
@ -1,8 +1,33 @@
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
|
||||||
pub fn emacs_parse_anonymous_org_document<C>(
|
use crate::context::HeadlineLevelFilter;
|
||||||
|
use crate::settings::GlobalSettings;
|
||||||
|
|
||||||
|
/// Generate elisp to configure org-mode parsing settings
|
||||||
|
///
|
||||||
|
/// Currently only org-list-allow-alphabetical is supported.
|
||||||
|
fn global_settings_elisp(global_settings: &GlobalSettings) -> String {
|
||||||
|
// This string concatenation is wildly inefficient but its only called in tests 🤷.
|
||||||
|
let mut ret = "".to_owned();
|
||||||
|
if global_settings.list_allow_alphabetical {
|
||||||
|
ret += "(setq org-list-allow-alphabetical t)\n"
|
||||||
|
}
|
||||||
|
if global_settings.tab_width != crate::settings::DEFAULT_TAB_WIDTH {
|
||||||
|
ret += format!("(setq-default tab-width {})", global_settings.tab_width).as_str();
|
||||||
|
}
|
||||||
|
if global_settings.odd_levels_only != HeadlineLevelFilter::default() {
|
||||||
|
ret += match global_settings.odd_levels_only {
|
||||||
|
HeadlineLevelFilter::Odd => "(setq org-odd-levels-only t)\n",
|
||||||
|
HeadlineLevelFilter::OddEven => "(setq org-odd-levels-only nil)\n",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn emacs_parse_anonymous_org_document<C>(
|
||||||
file_contents: C,
|
file_contents: C,
|
||||||
|
global_settings: &GlobalSettings,
|
||||||
) -> Result<String, Box<dyn std::error::Error>>
|
) -> Result<String, Box<dyn std::error::Error>>
|
||||||
where
|
where
|
||||||
C: AsRef<str>,
|
C: AsRef<str>,
|
||||||
@ -14,10 +39,12 @@ where
|
|||||||
(require 'org)
|
(require 'org)
|
||||||
(defun org-table-align () t)
|
(defun org-table-align () t)
|
||||||
(insert "{escaped_file_contents}")
|
(insert "{escaped_file_contents}")
|
||||||
|
{global_settings}
|
||||||
(org-mode)
|
(org-mode)
|
||||||
(message "%s" (pp-to-string (org-element-parse-buffer)))
|
(message "%s" (pp-to-string (org-element-parse-buffer)))
|
||||||
)"#,
|
)"#,
|
||||||
escaped_file_contents = escaped_file_contents
|
escaped_file_contents = escaped_file_contents,
|
||||||
|
global_settings = global_settings_elisp(global_settings)
|
||||||
);
|
);
|
||||||
let mut cmd = Command::new("emacs");
|
let mut cmd = Command::new("emacs");
|
||||||
let cmd = cmd
|
let cmd = cmd
|
||||||
@ -33,7 +60,10 @@ where
|
|||||||
Ok(String::from_utf8(org_sexp)?)
|
Ok(String::from_utf8(org_sexp)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn emacs_parse_file_org_document<P>(file_path: P) -> Result<String, Box<dyn std::error::Error>>
|
pub(crate) fn emacs_parse_file_org_document<P>(
|
||||||
|
file_path: P,
|
||||||
|
global_settings: &GlobalSettings,
|
||||||
|
) -> Result<String, Box<dyn std::error::Error>>
|
||||||
where
|
where
|
||||||
P: AsRef<Path>,
|
P: AsRef<Path>,
|
||||||
{
|
{
|
||||||
@ -46,9 +76,11 @@ where
|
|||||||
r#"(progn
|
r#"(progn
|
||||||
(require 'org)
|
(require 'org)
|
||||||
(defun org-table-align () t)
|
(defun org-table-align () t)
|
||||||
|
{global_settings}
|
||||||
(org-mode)
|
(org-mode)
|
||||||
(message "%s" (pp-to-string (org-element-parse-buffer)))
|
(message "%s" (pp-to-string (org-element-parse-buffer)))
|
||||||
)"#
|
)"#,
|
||||||
|
global_settings = global_settings_elisp(global_settings)
|
||||||
);
|
);
|
||||||
let mut cmd = Command::new("emacs");
|
let mut cmd = Command::new("emacs");
|
||||||
let cmd = cmd
|
let cmd = cmd
|
||||||
|
@ -16,7 +16,7 @@ pub struct GlobalSettings<'g, 's> {
|
|||||||
/// Set to true to allow for plain lists using single letters as the bullet in the same way that numbers are used.
|
/// Set to true to allow for plain lists using single letters as the bullet in the same way that numbers are used.
|
||||||
///
|
///
|
||||||
/// Corresponds to the org-list-allow-alphabetical elisp variable.
|
/// Corresponds to the org-list-allow-alphabetical elisp variable.
|
||||||
pub org_list_allow_alphabetical: bool,
|
pub list_allow_alphabetical: bool,
|
||||||
|
|
||||||
/// How many spaces a tab should be equal to.
|
/// How many spaces a tab should be equal to.
|
||||||
///
|
///
|
||||||
@ -29,6 +29,8 @@ pub struct GlobalSettings<'g, 's> {
|
|||||||
pub odd_levels_only: HeadlineLevelFilter,
|
pub odd_levels_only: HeadlineLevelFilter,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const DEFAULT_TAB_WIDTH: IndentationLevel = 8;
|
||||||
|
|
||||||
impl<'g, 's> GlobalSettings<'g, 's> {
|
impl<'g, 's> GlobalSettings<'g, 's> {
|
||||||
fn new() -> GlobalSettings<'g, 's> {
|
fn new() -> GlobalSettings<'g, 's> {
|
||||||
GlobalSettings {
|
GlobalSettings {
|
||||||
@ -38,9 +40,9 @@ impl<'g, 's> GlobalSettings<'g, 's> {
|
|||||||
},
|
},
|
||||||
in_progress_todo_keywords: BTreeSet::new(),
|
in_progress_todo_keywords: BTreeSet::new(),
|
||||||
complete_todo_keywords: BTreeSet::new(),
|
complete_todo_keywords: BTreeSet::new(),
|
||||||
org_list_allow_alphabetical: false,
|
list_allow_alphabetical: false,
|
||||||
tab_width: 8,
|
tab_width: DEFAULT_TAB_WIDTH,
|
||||||
odd_levels_only: HeadlineLevelFilter::OddEven,
|
odd_levels_only: HeadlineLevelFilter::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -51,8 +53,14 @@ impl<'g, 's> Default for GlobalSettings<'g, 's> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum HeadlineLevelFilter {
|
pub enum HeadlineLevelFilter {
|
||||||
Odd,
|
Odd,
|
||||||
OddEven,
|
OddEven,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for HeadlineLevelFilter {
|
||||||
|
fn default() -> Self {
|
||||||
|
HeadlineLevelFilter::OddEven
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -26,5 +26,6 @@ pub use file_access_interface::FileAccessInterface;
|
|||||||
pub use file_access_interface::LocalFileAccessInterface;
|
pub use file_access_interface::LocalFileAccessInterface;
|
||||||
pub use global_settings::GlobalSettings;
|
pub use global_settings::GlobalSettings;
|
||||||
pub use global_settings::HeadlineLevelFilter;
|
pub use global_settings::HeadlineLevelFilter;
|
||||||
|
pub use global_settings::DEFAULT_TAB_WIDTH;
|
||||||
pub(crate) use list::List;
|
pub(crate) use list::List;
|
||||||
pub(crate) use parser_with_context::parser_with_context;
|
pub(crate) use parser_with_context::parser_with_context;
|
||||||
|
10
src/lib.rs
10
src/lib.rs
@ -11,6 +11,10 @@ mod iter;
|
|||||||
pub mod parser;
|
pub mod parser;
|
||||||
pub mod types;
|
pub mod types;
|
||||||
|
|
||||||
pub use context::FileAccessInterface;
|
pub mod settings {
|
||||||
pub use context::GlobalSettings;
|
pub use crate::context::FileAccessInterface;
|
||||||
pub use context::LocalFileAccessInterface;
|
pub use crate::context::GlobalSettings;
|
||||||
|
pub use crate::context::HeadlineLevelFilter;
|
||||||
|
pub use crate::context::LocalFileAccessInterface;
|
||||||
|
pub use crate::context::DEFAULT_TAB_WIDTH;
|
||||||
|
}
|
||||||
|
@ -5,8 +5,8 @@ use std::path::Path;
|
|||||||
|
|
||||||
use ::organic::parser::parse;
|
use ::organic::parser::parse;
|
||||||
use organic::parser::parse_with_settings;
|
use organic::parser::parse_with_settings;
|
||||||
use organic::GlobalSettings;
|
use organic::settings::GlobalSettings;
|
||||||
use organic::LocalFileAccessInterface;
|
use organic::settings::LocalFileAccessInterface;
|
||||||
|
|
||||||
#[cfg(feature = "tracing")]
|
#[cfg(feature = "tracing")]
|
||||||
use crate::init_tracing::init_telemetry;
|
use crate::init_tracing::init_telemetry;
|
||||||
|
@ -11,8 +11,8 @@ use super::OrgSource;
|
|||||||
use crate::context::HeadlineLevelFilter;
|
use crate::context::HeadlineLevelFilter;
|
||||||
use crate::error::CustomError;
|
use crate::error::CustomError;
|
||||||
use crate::error::Res;
|
use crate::error::Res;
|
||||||
|
use crate::settings::GlobalSettings;
|
||||||
use crate::types::Keyword;
|
use crate::types::Keyword;
|
||||||
use crate::GlobalSettings;
|
|
||||||
|
|
||||||
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
|
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
|
||||||
pub(crate) fn scan_for_in_buffer_settings<'s>(
|
pub(crate) fn scan_for_in_buffer_settings<'s>(
|
||||||
|
@ -166,12 +166,8 @@ fn plain_list_item<'b, 'g, 'r, 's>(
|
|||||||
|(_bullet_type, bull)| Into::<&str>::into(bull) != "*" || indent_level > 0,
|
|(_bullet_type, bull)| Into::<&str>::into(bull) != "*" || indent_level > 0,
|
||||||
)(remaining)?;
|
)(remaining)?;
|
||||||
|
|
||||||
let (remaining, _maybe_counter_set) = opt(tuple((
|
let (remaining, _maybe_counter_set) =
|
||||||
space1,
|
opt(tuple((space1, tag("[@"), counter_set_value, tag("]"))))(remaining)?;
|
||||||
tag("[@"),
|
|
||||||
parser_with_context!(counter)(context),
|
|
||||||
tag("]"),
|
|
||||||
)))(remaining)?;
|
|
||||||
|
|
||||||
let (remaining, maybe_checkbox) = opt(tuple((space1, item_checkbox)))(remaining)?;
|
let (remaining, maybe_checkbox) = opt(tuple((space1, item_checkbox)))(remaining)?;
|
||||||
|
|
||||||
@ -302,7 +298,7 @@ fn counter<'b, 'g, 'r, 's>(
|
|||||||
context: RefContext<'b, 'g, 'r, 's>,
|
context: RefContext<'b, 'g, 'r, 's>,
|
||||||
input: OrgSource<'s>,
|
input: OrgSource<'s>,
|
||||||
) -> Res<OrgSource<'s>, OrgSource<'s>> {
|
) -> Res<OrgSource<'s>, OrgSource<'s>> {
|
||||||
if context.get_global_settings().org_list_allow_alphabetical {
|
if context.get_global_settings().list_allow_alphabetical {
|
||||||
alt((
|
alt((
|
||||||
recognize(one_of(
|
recognize(one_of(
|
||||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
||||||
@ -314,6 +310,16 @@ fn counter<'b, 'g, 'r, 's>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
|
||||||
|
fn counter_set_value<'s>(input: OrgSource<'s>) -> Res<OrgSource<'s>, OrgSource<'s>> {
|
||||||
|
alt((
|
||||||
|
recognize(one_of(
|
||||||
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
||||||
|
)),
|
||||||
|
digit1,
|
||||||
|
))(input)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
|
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
|
||||||
fn plain_list_end<'b, 'g, 'r, 's>(
|
fn plain_list_end<'b, 'g, 'r, 's>(
|
||||||
_context: RefContext<'b, 'g, 'r, 's>,
|
_context: RefContext<'b, 'g, 'r, 's>,
|
||||||
|
@ -1,2 +1,5 @@
|
|||||||
#[cfg(feature = "compare")]
|
#![cfg(feature = "compare")]
|
||||||
|
|
||||||
|
#[feature(exit_status_error)]
|
||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/tests.rs"));
|
include!(concat!(env!("OUT_DIR"), "/tests.rs"));
|
||||||
|
@ -1,7 +1,66 @@
|
|||||||
|
// TODO: Investigate writing a proc macro to make specifying these combinations easier. For example, currently I am only setting 1 setting per test to keep the repetition reasonable when I should be mixing all the different combinations.
|
||||||
|
|
||||||
|
{expect_fail}
|
||||||
#[test]
|
#[test]
|
||||||
fn {name}() -> Result<(), Box<dyn std::error::Error>> {{
|
fn autogen_default_{name}() -> Result<(), Box<dyn std::error::Error>> {{
|
||||||
let org_path = "{path}";
|
let org_path = "{path}";
|
||||||
let org_contents = std::fs::read_to_string(org_path).expect("Read org file.");
|
let org_contents = std::fs::read_to_string(org_path).expect("Read org file.");
|
||||||
organic::compare::run_anonymous_compare(org_contents.as_str())?;
|
organic::compare::run_anonymous_compare(org_contents.as_str())?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
{expect_fail}
|
||||||
|
#[test]
|
||||||
|
fn autogen_la_{name}() -> Result<(), Box<dyn std::error::Error>> {{
|
||||||
|
let org_path = "{path}";
|
||||||
|
let org_contents = std::fs::read_to_string(org_path).expect("Read org file.");
|
||||||
|
let global_settings = {{
|
||||||
|
let mut global_settings = organic::settings::GlobalSettings::default();
|
||||||
|
global_settings.list_allow_alphabetical = true;
|
||||||
|
global_settings
|
||||||
|
}};
|
||||||
|
organic::compare::run_anonymous_compare_with_settings(org_contents.as_str(), &global_settings)?;
|
||||||
|
Ok(())
|
||||||
|
}}
|
||||||
|
|
||||||
|
{expect_fail}
|
||||||
|
#[test]
|
||||||
|
fn autogen_t1_{name}() -> Result<(), Box<dyn std::error::Error>> {{
|
||||||
|
let org_path = "{path}";
|
||||||
|
let org_contents = std::fs::read_to_string(org_path).expect("Read org file.");
|
||||||
|
let global_settings = {{
|
||||||
|
let mut global_settings = organic::settings::GlobalSettings::default();
|
||||||
|
global_settings.tab_width = 1;
|
||||||
|
global_settings
|
||||||
|
}};
|
||||||
|
organic::compare::run_anonymous_compare_with_settings(org_contents.as_str(), &global_settings)?;
|
||||||
|
Ok(())
|
||||||
|
}}
|
||||||
|
|
||||||
|
{expect_fail}
|
||||||
|
#[test]
|
||||||
|
fn autogen_t16_{name}() -> Result<(), Box<dyn std::error::Error>> {{
|
||||||
|
let org_path = "{path}";
|
||||||
|
let org_contents = std::fs::read_to_string(org_path).expect("Read org file.");
|
||||||
|
let global_settings = {{
|
||||||
|
let mut global_settings = organic::settings::GlobalSettings::default();
|
||||||
|
global_settings.tab_width = 16;
|
||||||
|
global_settings
|
||||||
|
}};
|
||||||
|
organic::compare::run_anonymous_compare_with_settings(org_contents.as_str(), &global_settings)?;
|
||||||
|
Ok(())
|
||||||
|
}}
|
||||||
|
|
||||||
|
{expect_fail}
|
||||||
|
#[test]
|
||||||
|
fn autogen_odd_{name}() -> Result<(), Box<dyn std::error::Error>> {{
|
||||||
|
let org_path = "{path}";
|
||||||
|
let org_contents = std::fs::read_to_string(org_path).expect("Read org file.");
|
||||||
|
let global_settings = {{
|
||||||
|
let mut global_settings = organic::settings::GlobalSettings::default();
|
||||||
|
global_settings.odd_levels_only = organic::settings::HeadlineLevelFilter::Odd;
|
||||||
|
global_settings
|
||||||
|
}};
|
||||||
|
organic::compare::run_anonymous_compare_with_settings(org_contents.as_str(), &global_settings)?;
|
||||||
|
Ok(())
|
||||||
|
}}
|
||||||
|
Loading…
Reference in New Issue
Block a user