Решение на Logging от Християн Захариев
Към профила на Християн Захариев
Резултати
- 12 точки от тестове
- 0 бонус точки
- 12 точки общо
- 9 успешни тест(а)
- 6 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20190123-22631-sjtjwi/solution) warning: function is never used: `main` --> src/lib.rs:144:1 | 144 | fn main() { | ^^^^^^^^^ | = note: #[warn(dead_code)] on by default Finished dev [unoptimized + debuginfo] target(s) in 5.20s Running target/debug/deps/solution-2e785d603b538f71 running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out Running target/debug/deps/solution_test-29808948fb50ed3a running 15 tests test solution_test::test_automatic_flushing_when_buffer_limit_is_reached ... FAILED test solution_test::test_automatic_flushing_when_zero_buffer_limit ... FAILED test solution_test::test_basic_log ... ok test solution_test::test_basic_push ... ok test solution_test::test_cloning_a_logger_shares_a_buffer ... ok test solution_test::test_cloning_a_logger_shares_their_io ... ok test solution_test::test_erroring_io ... FAILED test solution_test::test_flushing_the_buffer ... ok test solution_test::test_logger_combinations ... ok test solution_test::test_multilogger_logs_and_flushes_when_needed ... FAILED test solution_test::test_multilogger_logs_to_several_ios ... ok test solution_test::test_reordering_logs_in_buffer ... ok test solution_test::test_reordering_logs_in_io ... ok test solution_test::test_scoped_logger ... FAILED test solution_test::test_scoped_logger_with_a_string_tag ... FAILED failures: ---- solution_test::test_automatic_flushing_when_buffer_limit_is_reached stdout ---- thread 'solution_test::test_automatic_flushing_when_buffer_limit_is_reached' panicked at 'assertion failed: `(left == right)` left: `"One\nTwo\n"`, right: `"One\nTwo\nThree\n"`', tests/solution_test.rs:200:5 note: Run with `RUST_BACKTRACE=1` for a backtrace. ---- solution_test::test_automatic_flushing_when_zero_buffer_limit stdout ---- thread 'solution_test::test_automatic_flushing_when_zero_buffer_limit' panicked at 'assertion failed: `(left == right)` left: `1`, right: `0`', tests/solution_test.rs:210:9 ---- solution_test::test_erroring_io stdout ---- thread 'solution_test::test_erroring_io' panicked at 'Expected try_flush with an erroring IO to return an error', tests/solution_test.rs:340:9 ---- solution_test::test_multilogger_logs_and_flushes_when_needed stdout ---- thread 'solution_test::test_multilogger_logs_and_flushes_when_needed' panicked at 'assertion failed: `(left == right)` left: `2`, right: `0`', tests/solution_test.rs:288:9 ---- solution_test::test_scoped_logger stdout ---- thread 'solution_test::test_scoped_logger' panicked at 'assertion failed: `(left == right)` left: `"[First] One\n[Second] Two\n[Second] Three\n[First] Four\n[First] One\n[Second] Two\n[Second] Three\n[First] Four\n"`, right: `"[First] One\n[Second] Two\n[Second] Three\n[First] Four\n"`', tests/solution_test.rs:315:5 ---- solution_test::test_scoped_logger_with_a_string_tag stdout ---- thread 'solution_test::test_scoped_logger_with_a_string_tag' panicked at 'assertion failed: `(left == right)` left: `""`, right: `"[First] Test\n"`', tests/solution_test.rs:329:5 failures: solution_test::test_automatic_flushing_when_buffer_limit_is_reached solution_test::test_automatic_flushing_when_zero_buffer_limit solution_test::test_erroring_io solution_test::test_multilogger_logs_and_flushes_when_needed solution_test::test_scoped_logger solution_test::test_scoped_logger_with_a_string_tag test result: FAILED. 9 passed; 6 failed; 0 ignored; 0 measured; 0 filtered out error: test failed, to rerun pass '--test solution_test'
Това "гълта" стойности. Ако влезеш в клона, в който flush-ваш, не влизаш в клона, в който добавяш нова стойност. Идеята беше да си логваш неща нормално, и в случай, че се мине някаква граница, след това да се flush-не. Няма логика push-а да е в else-а в тази ситуация.
Все пак искахме try_flush да работи коректно. Т.е., ако има грешка при писане, да засече тази грешка.
Спокойно можеше да имплементираш
flush
в самия trait, така:Оттам нататък, в
try_flush
можеше да сложиш долната имплементация, и вместоexpect
, да върнеш грешка. Методаexpect
ще panic-не, а не търсехме това, имаме обяснение за "Error handling" в условието.Това не работи както искахме в условието. Когато кажеш "values вече е нов Rc", този нов Rc няма никаква връзка с предния. Предишни клонинги не споделят тази стойност, и съответно ако клонираш logger-а и викнеш flush на единия от клонингите, той вече е несвързан с буфера на останалите.
Можеше да викнеш
self.values.borrow_mut().clear()
, например.Също както по-горе:
try_flush
не е имплементирано правилно.