--- /dev/null
+use strict;
+use warnings;
+
+use Test::More tests => 13;
+
+eval q{
+ package Class1;
+ sub cleaned1 {}
+ use namespace::clean;
+ 1;
+} or die $@;
+
+ok !Class1->can('cleaned1'), 'basic clean';
+
+eval q{
+ package Class1;
+ sub cleaned2 {}
+ use namespace::clean;
+ 1;
+} or die $@;
+
+ok !Class1->can('cleaned2'), 'clean same class again';
+
+eval q{
+ package Class2;
+ sub cleaned1 {}
+ use namespace::clean;
+ sub left1 {}
+ no namespace::clean;
+ sub cleaned2 {}
+ use namespace::clean;
+ 1;
+} or die $@;
+
+ok !Class2->can('cleaned1'), 'basic clean before no';
+ok +Class2->can('left1'), 'basic no clean';
+ok !Class2->can('cleaned2'), 'basic clean after no';
+
+eval q{
+ package Class2;
+ sub cleaned3 {}
+ use namespace::clean;
+ sub left2 {}
+ no namespace::clean;
+ sub cleaned4 {}
+ use namespace::clean;
+ 1;
+} or die $@;
+
+ok !Class2->can('cleaned3'), 'clean again before no';
+ok +Class2->can('left2'), 'clean again no clean';
+ok !Class2->can('cleaned4'), 'clean again after no';
+
+eval q{
+ package Class3;
+ sub cleaned1 {}
+ use namespace::clean;
+ sub cleaned2 {}
+ no namespace::clean;
+ {
+ sub cleaned3 {}
+ use namespace::clean;
+ }
+ BEGIN {
+ package main;
+ ok !Class3->can('cleaned3'), 'clean inner scope';
+ {
+ local $TODO = 'unable to differentiate scopes';
+ ok +Class3->can('cleaned1'), 'clean inner scope leaves outer';
+ }
+ ok +Class3->can('cleaned2'), 'clean inner scope leaves outer no';
+ }
+ use namespace::clean;
+ 1;
+} or die $@;
+
+ok !Class3->can('cleaned1'), 'clean after scoped';
+ok +Class3->can('cleaned2'), 'no clean after scoped';