mirror of
https://github.com/wisdgod/cursor-api.git
synced 2025-10-05 14:46:53 +08:00
0.3.6: WIP
This commit is contained in:
165
patch/chrono-0.4.41/tests/dateutils.rs
Normal file
165
patch/chrono-0.4.41/tests/dateutils.rs
Normal file
@@ -0,0 +1,165 @@
|
||||
#![cfg(all(unix, feature = "clock", feature = "std"))]
|
||||
|
||||
use std::{path, process, thread};
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
use chrono::Days;
|
||||
use chrono::{Datelike, Local, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Timelike};
|
||||
|
||||
fn verify_against_date_command_local(path: &'static str, dt: NaiveDateTime) {
|
||||
let output = process::Command::new(path)
|
||||
.arg("-d")
|
||||
.arg(format!("{}-{:02}-{:02} {:02}:05:01", dt.year(), dt.month(), dt.day(), dt.hour()))
|
||||
.arg("+%Y-%m-%d %H:%M:%S %:z")
|
||||
.output()
|
||||
.unwrap();
|
||||
|
||||
let date_command_str = String::from_utf8(output.stdout).unwrap();
|
||||
|
||||
// The below would be preferred. At this stage neither earliest() or latest()
|
||||
// seems to be consistent with the output of the `date` command, so we simply
|
||||
// compare both.
|
||||
// let local = Local
|
||||
// .with_ymd_and_hms(year, month, day, hour, 5, 1)
|
||||
// // looks like the "date" command always returns a given time when it is ambiguous
|
||||
// .earliest();
|
||||
|
||||
// if let Some(local) = local {
|
||||
// assert_eq!(format!("{}\n", local), date_command_str);
|
||||
// } else {
|
||||
// // we are in a "Spring forward gap" due to DST, and so date also returns ""
|
||||
// assert_eq!("", date_command_str);
|
||||
// }
|
||||
|
||||
// This is used while a decision is made whether the `date` output needs to
|
||||
// be exactly matched, or whether MappedLocalTime::Ambiguous should be handled
|
||||
// differently
|
||||
|
||||
let date = NaiveDate::from_ymd_opt(dt.year(), dt.month(), dt.day()).unwrap();
|
||||
match Local.from_local_datetime(&date.and_hms_opt(dt.hour(), 5, 1).unwrap()) {
|
||||
chrono::MappedLocalTime::Ambiguous(a, b) => assert!(
|
||||
format!("{}\n", a) == date_command_str || format!("{}\n", b) == date_command_str
|
||||
),
|
||||
chrono::MappedLocalTime::Single(a) => {
|
||||
assert_eq!(format!("{}\n", a), date_command_str);
|
||||
}
|
||||
chrono::MappedLocalTime::None => {
|
||||
assert_eq!("", date_command_str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// path to Unix `date` command. Should work on most Linux and Unixes. Not the
|
||||
/// path for MacOS (/bin/date) which uses a different version of `date` with
|
||||
/// different arguments (so it won't run which is okay).
|
||||
/// for testing only
|
||||
#[allow(dead_code)]
|
||||
#[cfg(not(target_os = "aix"))]
|
||||
const DATE_PATH: &str = "/usr/bin/date";
|
||||
#[allow(dead_code)]
|
||||
#[cfg(target_os = "aix")]
|
||||
const DATE_PATH: &str = "/opt/freeware/bin/date";
|
||||
|
||||
#[cfg(test)]
|
||||
/// test helper to sanity check the date command behaves as expected
|
||||
/// asserts the command succeeded
|
||||
fn assert_run_date_version() {
|
||||
// note environment variable `LANG`
|
||||
match std::env::var_os("LANG") {
|
||||
Some(lang) => eprintln!("LANG: {:?}", lang),
|
||||
None => eprintln!("LANG not set"),
|
||||
}
|
||||
let out = process::Command::new(DATE_PATH).arg("--version").output().unwrap();
|
||||
let stdout = String::from_utf8(out.stdout).unwrap();
|
||||
let stderr = String::from_utf8(out.stderr).unwrap();
|
||||
// note the `date` binary version
|
||||
eprintln!("command: {:?} --version\nstdout: {:?}\nstderr: {:?}", DATE_PATH, stdout, stderr);
|
||||
assert!(out.status.success(), "command failed: {:?} --version", DATE_PATH);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn try_verify_against_date_command() {
|
||||
if !path::Path::new(DATE_PATH).exists() {
|
||||
eprintln!("date command {:?} not found, skipping", DATE_PATH);
|
||||
return;
|
||||
}
|
||||
assert_run_date_version();
|
||||
|
||||
eprintln!(
|
||||
"Run command {:?} for every hour from 1975 to 2077, skipping some years...",
|
||||
DATE_PATH,
|
||||
);
|
||||
|
||||
let mut children = vec![];
|
||||
for year in [1975, 1976, 1977, 2020, 2021, 2022, 2073, 2074, 2075, 2076, 2077].iter() {
|
||||
children.push(thread::spawn(|| {
|
||||
let mut date = NaiveDate::from_ymd_opt(*year, 1, 1).unwrap().and_time(NaiveTime::MIN);
|
||||
let end = NaiveDate::from_ymd_opt(*year + 1, 1, 1).unwrap().and_time(NaiveTime::MIN);
|
||||
while date <= end {
|
||||
verify_against_date_command_local(DATE_PATH, date);
|
||||
date += chrono::TimeDelta::try_hours(1).unwrap();
|
||||
}
|
||||
}));
|
||||
}
|
||||
for child in children {
|
||||
// Wait for the thread to finish. Returns a result.
|
||||
let _ = child.join();
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
fn verify_against_date_command_format_local(path: &'static str, dt: NaiveDateTime) {
|
||||
let required_format =
|
||||
"d%d D%D F%F H%H I%I j%j k%k l%l m%m M%M q%q S%S T%T u%u U%U w%w W%W X%X y%y Y%Y z%:z";
|
||||
// a%a - depends from localization
|
||||
// A%A - depends from localization
|
||||
// b%b - depends from localization
|
||||
// B%B - depends from localization
|
||||
// h%h - depends from localization
|
||||
// c%c - depends from localization
|
||||
// p%p - depends from localization
|
||||
// r%r - depends from localization
|
||||
// x%x - fails, date is dd/mm/yyyy, chrono is dd/mm/yy, same as %D
|
||||
// Z%Z - too many ways to represent it, will most likely fail
|
||||
|
||||
let output = process::Command::new(path)
|
||||
.env("LANG", "c")
|
||||
.env("LC_ALL", "c")
|
||||
.arg("-d")
|
||||
.arg(format!(
|
||||
"{}-{:02}-{:02} {:02}:{:02}:{:02}",
|
||||
dt.year(),
|
||||
dt.month(),
|
||||
dt.day(),
|
||||
dt.hour(),
|
||||
dt.minute(),
|
||||
dt.second()
|
||||
))
|
||||
.arg(format!("+{}", required_format))
|
||||
.output()
|
||||
.unwrap();
|
||||
|
||||
let date_command_str = String::from_utf8(output.stdout).unwrap();
|
||||
let date = NaiveDate::from_ymd_opt(dt.year(), dt.month(), dt.day()).unwrap();
|
||||
let ldt = Local
|
||||
.from_local_datetime(&date.and_hms_opt(dt.hour(), dt.minute(), dt.second()).unwrap())
|
||||
.unwrap();
|
||||
let formatted_date = format!("{}\n", ldt.format(required_format));
|
||||
assert_eq!(date_command_str, formatted_date);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(target_os = "linux")]
|
||||
fn try_verify_against_date_command_format() {
|
||||
if !path::Path::new(DATE_PATH).exists() {
|
||||
eprintln!("date command {:?} not found, skipping", DATE_PATH);
|
||||
return;
|
||||
}
|
||||
assert_run_date_version();
|
||||
|
||||
let mut date = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_opt(12, 11, 13).unwrap();
|
||||
while date.year() < 2008 {
|
||||
verify_against_date_command_format_local(DATE_PATH, date);
|
||||
date = date + Days::new(55);
|
||||
}
|
||||
}
|
89
patch/chrono-0.4.41/tests/wasm.rs
Normal file
89
patch/chrono-0.4.41/tests/wasm.rs
Normal file
@@ -0,0 +1,89 @@
|
||||
//! Run this test with:
|
||||
//! `env TZ="$(date +%z)" NOW="$(date +%s)" wasm-pack test --node -- --features wasmbind`
|
||||
//!
|
||||
//! The `TZ` and `NOW` variables are used to compare the results inside the WASM environment with
|
||||
//! the host system.
|
||||
//! The check will fail if the local timezone does not match one of the timezones defined below.
|
||||
|
||||
#![cfg(all(
|
||||
target_arch = "wasm32",
|
||||
feature = "wasmbind",
|
||||
feature = "clock",
|
||||
not(any(target_os = "emscripten", target_os = "wasi"))
|
||||
))]
|
||||
|
||||
use chrono::prelude::*;
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn now() {
|
||||
let utc: DateTime<Utc> = Utc::now();
|
||||
let local: DateTime<Local> = Local::now();
|
||||
|
||||
// Ensure time set by the test script is correct
|
||||
let now = env!("NOW");
|
||||
let actual = NaiveDateTime::parse_from_str(&now, "%s").unwrap().and_utc();
|
||||
let diff = utc - actual;
|
||||
assert!(
|
||||
diff < chrono::TimeDelta::try_minutes(5).unwrap(),
|
||||
"expected {} - {} == {} < 5m (env var: {})",
|
||||
utc,
|
||||
actual,
|
||||
diff,
|
||||
now,
|
||||
);
|
||||
|
||||
let tz = env!("TZ");
|
||||
eprintln!("testing with tz={}", tz);
|
||||
|
||||
// Ensure offset retrieved when getting local time is correct
|
||||
let expected_offset = match tz {
|
||||
"ACST-9:30" => FixedOffset::east_opt(19 * 30 * 60).unwrap(),
|
||||
"Asia/Katmandu" => FixedOffset::east_opt(23 * 15 * 60).unwrap(), // No DST thankfully
|
||||
"EDT" | "EST4" | "-0400" => FixedOffset::east_opt(-4 * 60 * 60).unwrap(),
|
||||
"EST" | "-0500" => FixedOffset::east_opt(-5 * 60 * 60).unwrap(),
|
||||
"UTC0" | "+0000" => FixedOffset::east_opt(0).unwrap(),
|
||||
tz => panic!("unexpected TZ {}", tz),
|
||||
};
|
||||
assert_eq!(
|
||||
&expected_offset,
|
||||
local.offset(),
|
||||
"expected: {:?} local: {:?}",
|
||||
expected_offset,
|
||||
local.offset(),
|
||||
);
|
||||
}
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn from_is_exact() {
|
||||
let now = js_sys::Date::new_0();
|
||||
|
||||
let dt = DateTime::<Utc>::from(now.clone());
|
||||
|
||||
assert_eq!(now.get_time() as i64, dt.timestamp_millis());
|
||||
}
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn local_from_local_datetime() {
|
||||
let now = Local::now();
|
||||
let ndt = now.naive_local();
|
||||
let res = match Local.from_local_datetime(&ndt).single() {
|
||||
Some(v) => v,
|
||||
None => panic! {"Required for test!"},
|
||||
};
|
||||
assert_eq!(now, res);
|
||||
}
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
fn convert_all_parts_with_milliseconds() {
|
||||
let time: DateTime<Utc> = "2020-12-01T03:01:55.974Z".parse().unwrap();
|
||||
let js_date = js_sys::Date::from(time);
|
||||
|
||||
assert_eq!(js_date.get_utc_full_year(), 2020);
|
||||
assert_eq!(js_date.get_utc_month(), 11); // months are numbered 0..=11
|
||||
assert_eq!(js_date.get_utc_date(), 1);
|
||||
assert_eq!(js_date.get_utc_hours(), 3);
|
||||
assert_eq!(js_date.get_utc_minutes(), 1);
|
||||
assert_eq!(js_date.get_utc_seconds(), 55);
|
||||
assert_eq!(js_date.get_utc_milliseconds(), 974);
|
||||
}
|
28
patch/chrono-0.4.41/tests/win_bindings.rs
Normal file
28
patch/chrono-0.4.41/tests/win_bindings.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
#![cfg(all(windows, feature = "clock", feature = "std"))]
|
||||
|
||||
use std::fs;
|
||||
use windows_bindgen::bindgen;
|
||||
|
||||
#[test]
|
||||
fn gen_bindings() {
|
||||
let input = "src/offset/local/win_bindings.txt";
|
||||
let output = "src/offset/local/win_bindings.rs";
|
||||
let existing = fs::read_to_string(output).unwrap();
|
||||
|
||||
bindgen(["--no-deps", "--etc", input]).unwrap();
|
||||
|
||||
// Check the output is the same as before.
|
||||
// Depending on the git configuration the file may have been checked out with `\r\n` newlines or
|
||||
// with `\n`. Compare line-by-line to ignore this difference.
|
||||
let mut new = fs::read_to_string(output).unwrap();
|
||||
if existing.contains("\r\n") && !new.contains("\r\n") {
|
||||
new = new.replace("\n", "\r\n");
|
||||
} else if !existing.contains("\r\n") && new.contains("\r\n") {
|
||||
new = new.replace("\r\n", "\n");
|
||||
}
|
||||
|
||||
similar_asserts::assert_eq!(existing, new);
|
||||
if !new.lines().eq(existing.lines()) {
|
||||
panic!("generated file `{output}` is changed.");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user