Got a firm start on UniversalStrings.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s

This commit is contained in:
2026-03-14 12:33:40 -04:00
parent caee3bbe6a
commit 6014a3bb25

View File

@@ -349,13 +349,23 @@ enum DataOrigin {
struct ParagraphData { struct ParagraphData {
string: String, string: String,
origin: DataOrigin, origin: DataOrigin,
initial: bool,
} }
impl ParagraphData { impl ParagraphData {
fn initial(string: String) -> Self {
Self {
string: string,
origin: DataOrigin::Human,
initial: true,
}
}
fn new(string: String, origin: DataOrigin) -> Self { fn new(string: String, origin: DataOrigin) -> Self {
Self { Self {
string: string, string: string,
origin: origin, origin: origin,
initial: false,
} }
} }
@@ -369,24 +379,41 @@ impl ParagraphData {
DataOrigin::Computer => false, DataOrigin::Computer => false,
} }
} }
fn is_initial(&self) -> bool {
self.initial
}
} }
#[cfg(test)] #[cfg(test)]
mod paragraph_data { mod paragraph_data {
use super::*; use super::*;
#[test]
fn can_determine_initial_information() {
let text = Uuid::new_v4().to_string();
let data = ParagraphData::initial(text.clone());
assert_eq!(data.get_text(), &text);
assert!(data.by_human(), "{:?} should have returned true", data);
assert!(data.is_initial(), "{:?} should have returned true", data);
}
#[test] #[test]
fn can_be_made_by_humans() { fn can_be_made_by_humans() {
let text = Uuid::new_v4().to_string(); let text = Uuid::new_v4().to_string();
let data = ParagraphData::new(text.clone(), DataOrigin::Human); let data = ParagraphData::new(text.clone(), DataOrigin::Human);
assert_eq!(data.get_text(), &text);
assert!(data.by_human(), "{:?} should have returned true", data); assert!(data.by_human(), "{:?} should have returned true", data);
assert!(!data.is_initial(), "{:?} should have returned false", data);
} }
#[test] #[test]
fn can_be_made_by_computers() { fn can_be_made_by_computers() {
let text = Uuid::new_v4().to_string(); let text = Uuid::new_v4().to_string();
let data = ParagraphData::new(text.clone(), DataOrigin::Computer); let data = ParagraphData::new(text.clone(), DataOrigin::Computer);
assert!(!data.by_human(), "{:?} should have returned true", data); assert_eq!(data.get_text(), &text);
assert!(!data.by_human(), "{:?} should have returned false", data);
assert!(!data.is_initial(), "{:?} should have returned false", data);
} }
} }
@@ -395,9 +422,9 @@ struct Paragraph {
} }
impl Paragraph { impl Paragraph {
fn new(string: String, lang: Language) -> Self { fn new(lang: Language, string: String) -> Self {
let mut data = HashMap::new(); let mut data = HashMap::new();
data.insert(lang, ParagraphData::new(string, DataOrigin::Human)); data.insert(lang, ParagraphData::initial(string));
Self { data: data } Self { data: data }
} }
@@ -423,7 +450,16 @@ impl Paragraph {
} }
} }
fn get_original(&self) -> HashMap<Language, String> { fn get_initial(&self) -> (&Language, &String) {
for (lang, data) in self.data.iter() {
if data.is_initial() {
return (lang, data.get_text());
}
}
unreachable!("paragraph should initialize with data");
}
fn by_humans(&self) -> HashMap<Language, String> {
let mut output = HashMap::new(); let mut output = HashMap::new();
for (lang, data) in self.data.iter() { for (lang, data) in self.data.iter() {
if data.by_human() { if data.by_human() {
@@ -446,7 +482,7 @@ mod paragraphs {
]; ];
let data = Uuid::new_v4().to_string(); let data = Uuid::new_v4().to_string();
for lang in languages.iter() { for lang in languages.iter() {
let result = Paragraph::new(data.clone(), lang.clone()); let result = Paragraph::new(lang.clone(), data.clone());
assert_eq!(result.get(lang).unwrap(), &data); assert_eq!(result.get(lang).unwrap(), &data);
} }
} }
@@ -458,7 +494,7 @@ mod paragraphs {
Language::from_639_1("en").unwrap(), Language::from_639_1("en").unwrap(),
Language::from_639_1("ja").unwrap(), Language::from_639_1("ja").unwrap(),
]; ];
let mut paragraph = Paragraph::new(text[0].clone().to_string(), languages[0].clone()); let mut paragraph = Paragraph::new(languages[0].clone(), text[0].clone().to_string());
paragraph.add_translation(text[1].clone().to_string(), languages[1].clone()); paragraph.add_translation(text[1].clone().to_string(), languages[1].clone());
for i in 0..text.len() { for i in 0..text.len() {
assert_eq!(paragraph.get(&languages[i]).unwrap(), text[i]); assert_eq!(paragraph.get(&languages[i]).unwrap(), text[i]);
@@ -469,7 +505,7 @@ mod paragraphs {
fn does_add_translation_get_ignored_if_it_already_exists() { fn does_add_translation_get_ignored_if_it_already_exists() {
let text = "something"; let text = "something";
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new(text.to_string(), lang.clone()); let mut paragraph = Paragraph::new(lang.clone(), text.to_string());
paragraph.add_translation("other".to_string(), lang); paragraph.add_translation("other".to_string(), lang);
assert_eq!(paragraph.get(&lang).unwrap(), text); assert_eq!(paragraph.get(&lang).unwrap(), text);
} }
@@ -478,54 +514,80 @@ mod paragraphs {
fn does_improve_translation_replace_existing() { fn does_improve_translation_replace_existing() {
let text = "new"; let text = "new";
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new("old".to_string(), lang.clone()); let mut paragraph = Paragraph::new(lang.clone(), "old".to_string());
paragraph.improve_translation(text.to_string(), lang.clone()); paragraph.improve_translation(text.to_string(), lang.clone());
assert_eq!(paragraph.get(&lang).unwrap(), text); assert_eq!(paragraph.get(&lang).unwrap(), text);
} }
#[test] #[test]
fn can_determine_original_text() { fn can_determine_human_text() {
let text = "something"; let text = "something";
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let paragraph = Paragraph::new(text.to_string(), lang.clone()); let paragraph = Paragraph::new(lang.clone(), text.to_string());
let result = paragraph.get_original(); let result = paragraph.by_humans();
assert_eq!(result.len(), 1, "got wrong numnber of texts"); assert_eq!(result.len(), 1, "got wrong numnber of texts");
assert_eq!(result.get(&lang).unwrap(), text); assert_eq!(result.get(&lang).unwrap(), text);
} }
#[test] #[test]
fn add_translation_does_not_count_as_original_text() { fn add_translation_does_not_count_as_human_text() {
let text = "test"; let text = "test";
let lang = Language::from_639_1("en").unwrap(); let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new(text.to_string(), lang.clone()); let mut paragraph = Paragraph::new(lang.clone(), text.to_string());
paragraph.add_translation("テスト".to_string(), Language::from_639_1("ja").unwrap()); paragraph.add_translation("テスト".to_string(), Language::from_639_1("ja").unwrap());
let result = paragraph.get_original(); let result = paragraph.by_humans();
assert_eq!(result.len(), 1, "got wrong numnber of texts"); assert_eq!(result.len(), 1, "got wrong numnber of texts");
assert_eq!(result.get(&lang).unwrap(), text); assert_eq!(result.get(&lang).unwrap(), text);
} }
#[test] #[test]
fn impove_translation_does_get_added_as_original() { fn impove_translation_does_get_added_as_human() {
let text = ["test", "テスト"]; let text = ["test", "テスト"];
let languages = [ let languages = [
Language::from_639_1("en").unwrap(), Language::from_639_1("en").unwrap(),
Language::from_639_1("ja").unwrap(), Language::from_639_1("ja").unwrap(),
]; ];
let mut paragraph = Paragraph::new(text[0].clone().to_string(), languages[0].clone()); let mut paragraph = Paragraph::new(languages[0].clone(), text[0].clone().to_string());
paragraph.improve_translation(text[1].clone().to_string(), languages[1].clone()); paragraph.improve_translation(text[1].clone().to_string(), languages[1].clone());
let result = paragraph.get_original(); let result = paragraph.by_humans();
assert_eq!(result.len(), 2, "got wrong numnber of texts"); assert_eq!(result.len(), 2, "got wrong numnber of texts");
for i in 0..text.len() { for i in 0..text.len() {
assert_eq!(result.get(&languages[i]).unwrap(), text[i]); assert_eq!(result.get(&languages[i]).unwrap(), text[i]);
} }
} }
#[test]
fn can_get_original_text() {
let text = Uuid::nil().to_string();
let lang = Language::from_639_1("en").unwrap();
let mut paragraph = Paragraph::new(lang.clone(), text.clone());
paragraph.add_translation(
Uuid::new_v4().to_string(),
Language::from_639_1("ja").unwrap(),
);
paragraph.improve_translation(
Uuid::new_v4().to_string(),
Language::from_639_1("de").unwrap(),
);
let (rlang, rtext) = paragraph.get_initial();
assert_eq!(rlang, &lang);
assert_eq!(rtext, &text);
}
} }
struct UniversalString {} struct UniversalString {
data: Paragraph,
}
impl UniversalString { impl UniversalString {
fn new() -> Self { fn new(lang: Language, text: String) -> Self {
Self {} Self {
data: Paragraph::new(lang, text),
}
}
fn get(&self, lang: &Language) -> Option<&String> {
self.data.get(lang)
} }
} }
@@ -533,8 +595,49 @@ impl UniversalString {
mod universal_strings { mod universal_strings {
use super::*; use super::*;
const INITIAL_DATA: [&str; 5] = ["one", "two", "three", "four", "five"];
struct TestData {
data: Vec<String>,
}
impl TestData {
fn new(paragraphs: Vec<&str>) -> Self {
let mut holder = Vec::new();
for item in paragraphs.iter() {
holder.push(item.to_string());
}
Self { data: holder }
}
fn get_text(&self) -> String {
let mut output = "".to_string();
for paragraph in self.data.iter() {
output += paragraph;
output += "\u{2029}";
}
output
}
}
#[test] #[test]
fn are_initial_strings_empty() { fn are_initial_strings_empty() {
UniversalString::new(); let text = ["test", "テスト"];
let languages = [
Language::from_639_1("en").unwrap(),
Language::from_639_1("ja").unwrap(),
];
for i in 0..text.len() {
let ustr = UniversalString::new(languages[i].clone(), text[i].to_string());
assert_eq!(ustr.get(&languages[i]).unwrap(), text[i]);
}
}
#[test]
fn accepts_strings_with_multiple_paragraphs() {
let lang = Language::from_639_1("en").unwrap();
let input = TestData::new(INITIAL_DATA.to_vec());
let ustr = UniversalString::new(lang.clone(), input.get_text());
assert_eq!(ustr.get(&lang).unwrap(), &input.get_text());
} }
} }