Skip to content

Commit 1ea9c85

Browse files
committed
Add base64 tests
Based on feedback from Azure#3214
1 parent 7cd427a commit 1ea9c85

File tree

1 file changed

+165
-0
lines changed

1 file changed

+165
-0
lines changed

sdk/core/typespec_client_core/src/base64.rs

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,3 +332,168 @@ pub mod option {
332332
<Option<String>>::serialize(&encoded, serializer)
333333
}
334334
}
335+
336+
#[cfg(test)]
337+
mod tests {
338+
use super::{
339+
decode, decode_url_safe, deserialize, deserialize_url_safe, encode, encode_url_safe,
340+
option, serialize, serialize_url_safe,
341+
};
342+
use serde::{Deserialize, Serialize};
343+
344+
#[test]
345+
fn standard_encode() {
346+
assert_eq!(encode(b"Hello, world!"), "SGVsbG8sIHdvcmxkIQ==");
347+
assert_eq!(encode(b""), "");
348+
assert_eq!(encode(b"f"), "Zg==");
349+
assert_eq!(encode(b"fo"), "Zm8=");
350+
assert_eq!(encode(b"foo"), "Zm9v");
351+
}
352+
353+
#[test]
354+
fn standard_decode() {
355+
assert_eq!(decode("SGVsbG8sIHdvcmxkIQ==").unwrap(), b"Hello, world!");
356+
assert_eq!(decode("").unwrap(), b"");
357+
assert_eq!(decode("Zg==").unwrap(), b"f");
358+
assert_eq!(decode("Zm8=").unwrap(), b"fo");
359+
assert_eq!(decode("Zm9v").unwrap(), b"foo");
360+
}
361+
362+
#[test]
363+
fn url_safe_encode() {
364+
assert_eq!(encode_url_safe(b"Hello, world!"), "SGVsbG8sIHdvcmxkIQ");
365+
assert_eq!(encode_url_safe(b""), "");
366+
assert_eq!(encode_url_safe(b"f"), "Zg");
367+
assert_eq!(encode_url_safe(b"fo"), "Zm8");
368+
assert_eq!(encode_url_safe(b"foo"), "Zm9v");
369+
}
370+
371+
#[test]
372+
fn url_safe_decode() {
373+
assert_eq!(
374+
decode_url_safe("SGVsbG8sIHdvcmxkIQ").unwrap(),
375+
b"Hello, world!"
376+
);
377+
assert_eq!(decode_url_safe("").unwrap(), b"");
378+
assert_eq!(decode_url_safe("Zg").unwrap(), b"f");
379+
assert_eq!(decode_url_safe("Zm8").unwrap(), b"fo");
380+
assert_eq!(decode_url_safe("Zm9v").unwrap(), b"foo");
381+
}
382+
383+
#[test]
384+
fn roundtrip_standard() {
385+
let data = b"The quick brown fox jumps over the lazy dog";
386+
assert_eq!(decode(encode(data)).unwrap(), data);
387+
}
388+
389+
#[test]
390+
fn roundtrip_url_safe() {
391+
let data = b"The quick brown fox jumps over the lazy dog";
392+
assert_eq!(decode_url_safe(encode_url_safe(data)).unwrap(), data);
393+
}
394+
395+
#[derive(Serialize, Deserialize)]
396+
struct TestStruct {
397+
#[serde(serialize_with = "serialize", deserialize_with = "deserialize")]
398+
data: Vec<u8>,
399+
}
400+
401+
#[test]
402+
fn serde_standard() {
403+
let original = TestStruct {
404+
data: b"test data".to_vec(),
405+
};
406+
let json = serde_json::to_string(&original).unwrap();
407+
assert!(json.contains("dGVzdCBkYXRh"));
408+
let deserialized: TestStruct = serde_json::from_str(&json).unwrap();
409+
assert_eq!(deserialized.data, original.data);
410+
}
411+
412+
#[derive(Serialize, Deserialize)]
413+
struct TestStructUrlSafe {
414+
#[serde(
415+
serialize_with = "serialize_url_safe",
416+
deserialize_with = "deserialize_url_safe"
417+
)]
418+
data: Vec<u8>,
419+
}
420+
421+
#[test]
422+
fn serde_url_safe() {
423+
let original = TestStructUrlSafe {
424+
data: b"test data".to_vec(),
425+
};
426+
let json = serde_json::to_string(&original).unwrap();
427+
assert!(json.contains("dGVzdCBkYXRh"));
428+
let deserialized: TestStructUrlSafe = serde_json::from_str(&json).unwrap();
429+
assert_eq!(deserialized.data, original.data);
430+
}
431+
432+
#[derive(Serialize, Deserialize)]
433+
struct TestOptionalStruct {
434+
#[serde(
435+
serialize_with = "option::serialize",
436+
deserialize_with = "option::deserialize"
437+
)]
438+
data: Option<Vec<u8>>,
439+
}
440+
441+
#[test]
442+
fn serde_option_some() {
443+
let original = TestOptionalStruct {
444+
data: Some(b"test data".to_vec()),
445+
};
446+
let json = serde_json::to_string(&original).unwrap();
447+
assert!(json.contains("dGVzdCBkYXRh"));
448+
let deserialized: TestOptionalStruct = serde_json::from_str(&json).unwrap();
449+
assert_eq!(deserialized.data, original.data);
450+
}
451+
452+
#[test]
453+
fn serde_option_none() {
454+
let original = TestOptionalStruct { data: None };
455+
let json = serde_json::to_string(&original).unwrap();
456+
assert!(json.contains("null"));
457+
let deserialized: TestOptionalStruct = serde_json::from_str(&json).unwrap();
458+
assert_eq!(deserialized.data, None);
459+
}
460+
461+
#[derive(Serialize, Deserialize)]
462+
struct TestOptionalStructUrlSafe {
463+
#[serde(
464+
serialize_with = "option::serialize_url_safe",
465+
deserialize_with = "option::deserialize_url_safe"
466+
)]
467+
data: Option<Vec<u8>>,
468+
}
469+
470+
#[test]
471+
fn serde_option_url_safe_some() {
472+
let original = TestOptionalStructUrlSafe {
473+
data: Some(b"test data".to_vec()),
474+
};
475+
let json = serde_json::to_string(&original).unwrap();
476+
assert!(json.contains("dGVzdCBkYXRh"));
477+
let deserialized: TestOptionalStructUrlSafe = serde_json::from_str(&json).unwrap();
478+
assert_eq!(deserialized.data, original.data);
479+
}
480+
481+
#[test]
482+
fn serde_option_url_safe_none() {
483+
let original = TestOptionalStructUrlSafe { data: None };
484+
let json = serde_json::to_string(&original).unwrap();
485+
assert!(json.contains("null"));
486+
let deserialized: TestOptionalStructUrlSafe = serde_json::from_str(&json).unwrap();
487+
assert_eq!(deserialized.data, None);
488+
}
489+
490+
#[test]
491+
fn decode_invalid_standard() {
492+
assert!(decode("invalid!@#$").is_err());
493+
}
494+
495+
#[test]
496+
fn decode_invalid_url_safe() {
497+
assert!(decode_url_safe("invalid!@#$").is_err());
498+
}
499+
}

0 commit comments

Comments
 (0)