Решение на 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не е имплементирано правилно.