| 566 | } // namespace |
| 567 | |
| 568 | void TPointerTest::TestOperatorBool() { |
| 569 | using TVec = TVector<ui32>; |
| 570 | |
| 571 | // to be sure TImplicitlyCastable works as expected |
| 572 | UNIT_ASSERT((TImplicitlyCastable<int, bool>::Result)); |
| 573 | UNIT_ASSERT((TImplicitlyCastable<double, int>::Result)); |
| 574 | UNIT_ASSERT((TImplicitlyCastable<int*, void*>::Result)); |
| 575 | UNIT_ASSERT(!(TImplicitlyCastable<void*, int*>::Result)); |
| 576 | UNIT_ASSERT((TImplicitlyCastable<TImplicitlyCastableToBool, bool>::Result)); |
| 577 | UNIT_ASSERT((TImplicitlyCastable<TImplicitlyCastableToBool, int>::Result)); |
| 578 | UNIT_ASSERT((TImplicitlyCastable<TImplicitlyCastableToBool, ui64>::Result)); |
| 579 | UNIT_ASSERT(!(TImplicitlyCastable<TImplicitlyCastableToBool, void*>::Result)); |
| 580 | |
| 581 | // pointers |
| 582 | UNIT_ASSERT(!(TImplicitlyCastable<TSimpleSharedPtr<TVec>, int>::Result)); |
| 583 | UNIT_ASSERT(!(TImplicitlyCastable<TAutoPtr<ui64>, ui64>::Result)); |
| 584 | UNIT_ASSERT(!(TImplicitlyCastable<THolder<TVec>, bool>::Result)); // even this |
| 585 | |
| 586 | { |
| 587 | // mostly a compilability test |
| 588 | |
| 589 | THolder<TVec> a; |
| 590 | UNIT_ASSERT(!a); |
| 591 | UNIT_ASSERT(!bool(a)); |
| 592 | if (a) { |
| 593 | UNIT_ASSERT(false); |
| 594 | } |
| 595 | if (!a) { |
| 596 | UNIT_ASSERT(true); |
| 597 | } |
| 598 | |
| 599 | a.Reset(new TVec); |
| 600 | UNIT_ASSERT(a); |
| 601 | UNIT_ASSERT(bool(a)); |
| 602 | if (a) { |
| 603 | UNIT_ASSERT(true); |
| 604 | } |
| 605 | if (!a) { |
| 606 | UNIT_ASSERT(false); |
| 607 | } |
| 608 | |
| 609 | THolder<TVec> b(new TVec); |
| 610 | UNIT_ASSERT(a.Get() != b.Get()); |
| 611 | UNIT_ASSERT(a != b); |
| 612 | if (a == b) { |
| 613 | UNIT_ASSERT(false); |
| 614 | } |
| 615 | if (a != b) { |
| 616 | UNIT_ASSERT(true); |
| 617 | } |
| 618 | if (!(a && b)) { |
| 619 | UNIT_ASSERT(false); |
| 620 | } |
| 621 | if (a && b) { |
| 622 | UNIT_ASSERT(true); |
| 623 | } |
| 624 | |
| 625 | // int i = a; // does not compile |