package prefer latest
package require nx::test


nx::test case alias-redefine-method1 {
    #
    # redefine an object method by an alias pointing to an alias
    #
    proc ::foo args {;}
    
    nx::Object create o
    ? {::o public object method BAR {} {;}} ::o::BAR
    ? {::nsf::method::alias ::o bar ::foo} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "::o::bar exists"
    ? {info commands ::o::BAR} ::o::BAR              "a command ::o::BAR exists"
    ? {::nsf::method::alias o BAR ::o::bar} ::o::BAR "redefine an object method with an alias (pointing to an alias) 87a2"
}

nx::test case alias-redefine-method2 {
    #
    # redefine an object method by an alias pointing to an object method
    #
    proc ::foo args {;}
    
    nx::Object create o
    ? {::o public object method BAR {} {;}} ::o::BAR
    ? {::o public object method FOO {} {;}} ::o::FOO

    ? {info commands ::o::FOO} ::o::FOO              "a command ::o::FOO exists"
    ? {info commands ::o::BAR} ::o::BAR              "a command ::o::BAR exists"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "redefine an object method with an alias (pointing to a method) 87a2"
}


nx::test case alias-double-alias-proc {

    proc ::foo args {;}
    nx::Object create o

    ? {info commands ::o::FOO} ""                    "a command ::o::FOO' does not exist"
    ? {info commands ::o::BAR} ""                    "a command ::o::BAR does not exist"
    ? {::nsf::method::alias o FOO ::foo}    ::o::FOO "define an object alias based on existing ::foo"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "define an object alias based on alias based on existing ::o::FOO"
}

nx::test case alias-double-alias-define {
    #
    # same as alias-double-reference-proc, but method instead of proc as target of o::FOO
    #
    proc ::foo args {;}

    nx::Object create o
    ? {::nsf::method::alias ::o bar ::foo} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "::o::bar exists"
    ? {info commands ::o::FOO} ""                    "a command ::o::FOO' does not exists"
    ? {info commands ::o::BAR} ""                    "a command ::o::BAR does not exist"
    ? {::nsf::method::alias o FOO ::o::bar} ::o::FOO "define an object alias based on existing ::o::bar"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "define an object alias based on alias based on existing (?) ::o::bar"
}


nx::test case alias-double-alias-redefine {
    #
    # same as alias-double-reference-define, but redefined instead of new definition
    #
    proc ::foo args {;}
    
    nx::Object create o
    ? {::nsf::method::alias ::o FOO ::foo} ::o::FOO
    ? {::nsf::method::alias ::o bar ::foo} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "::o::bar exists"
    ? {info commands ::o::FOO} ::o::FOO              "a command ::o::FOO' exists"
    ? {info commands ::o::BAR} ""                    "a command ::o::BAR does not exist"
    ? {::nsf::method::alias o FOO ::o::bar} ::o::FOO "redefine an object alias based on existing ::o::bar"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "define an object alias based on alias based on existing ::o::FOO"
}

nx::test case alias-double-alias-redefine0 {
    #
    # same as alias-double-reference-define, but redefined second cmd instead of new definition
    #
    proc ::foo args {;}
    
    nx::Object create o
    ? {::o public object method BAR {} {;}} ::o::BAR
    ? {::nsf::method::alias ::o bar ::foo} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "::o::bar exists"
    ? {info commands ::o::FOO} ""                    "a command ::o::FOO' does not exist"
    ? {info commands ::o::BAR} ::o::BAR              "a command ::o::BAR exists"
    ? {::nsf::method::alias o FOO ::foo} ::o::FOO    "define an object alias based on existing ::foo"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "redefine an object alias based on alias based on existing ::o::FOO 87a2"
}

nx::test case alias-double-alias-redefine1 {
    #
    # same as alias-double-reference-define, but redefined second cmd instead of new definition
    #
    proc ::foo args {;}
    
    nx::Object create o
    ? {::o public object method BAR {} {;}} ::o::BAR
    ? {::nsf::method::alias ::o bar ::foo} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "::o::bar exists"
    ? {info commands ::o::FOO} ""                    "a command ::o::FOO' does not exist"
    ? {info commands ::o::BAR} ::o::BAR              "a command ::o::BAR exists"
    ? {::nsf::method::alias o FOO ::o::bar} ::o::FOO "define an object alias based on existing ::o::bar"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "redefine an object alias based on alias based on existing ::o::FOO 87a2"
}

nx::test case alias-double-alias-redefine2 {
    #
    # same as alias-double-reference-define, but redefined twice instead of new definition
    #
    proc ::foo args {;}
    
    nx::Object create o
    ? {::nsf::method::alias ::o FOO ::foo} ::o::FOO
    ? {::o public object method BAR {} {;}} ::o::BAR
    ? {::nsf::method::alias ::o bar ::foo} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "::o::bar exists"
    ? {info commands ::o::FOO} ::o::FOO              "a command ::o::FOO' exists"
    ? {info commands ::o::BAR} ::o::BAR              "a command ::o::BAR exists"
    ? {::nsf::method::alias o FOO ::o::bar} ::o::FOO "redefine an object alias based on existing ::o::bar"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "redefine an object alias based on alias based on existing ::o::FOO 87a2"
}



nx::test case alias-double-alias-object-method-redefine {

    proc ::foo args {;}
    
    nx::Object create o
    ? {::nsf::method::alias ::o FOO ::foo} ::o::FOO
    ? {::o public object method bar {} {;}} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "handle ::o::bar exists"
    ? {info commands ::o::FOO} ::o::FOO              "a command ::o::FOO' exists"
    ? {info commands ::o::BAR} ""                    "a command ::o::BAR does not exist"
    ? {::nsf::method::alias o FOO ::o::bar} ::o::FOO "redefine an object alias based on existing (?) ::o::bar"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "define an object alias based on alias based on existing ::o::FOO"
    ? {info exists ::nsf::alias(::o,FOO,1)} 1
    ? {info exists ::nsf::alias(::o,BAR,1)} 1
    
    o public object method bar {} {}
    ? {info exists ::nsf::alias(::o,FOO,1)} 1
    ? {info exists ::nsf::alias(::o,BAR,1)} 1
}


nx::test case alias-double-alias-object-method-redefine2 {

    proc ::foo args {;}
    
    nx::Object create o
    ? {::nsf::method::alias ::o FOO ::foo} ::o::FOO
    ? {::o public object method BAR {} {;}} ::o::BAR
    ? {::o public object method bar {} {;}} ::o::bar

    ? {info commands ::o::bar} ::o::bar              "handle ::o::bar exists"
    ? {info commands ::o::FOO} ::o::FOO              "a command ::o::FOO' exists"
    ? {info commands ::o::BAR} ::o::BAR              "a command ::o::BAR does not exist"
    ? {::nsf::method::alias o FOO ::o::bar} ::o::FOO "redefine an object alias based on existing (?) ::o::bar"
    ? {::nsf::method::alias o BAR ::o::FOO} ::o::BAR "redefine an object alias based on alias based on existing ::o::FOO 87a2"
}