anchor.diff:  
   
   Future testing_helper(Future f,String name){
  +  print("start  $name");
     return f.then((_)=>print("PASSED $name"),onError: (e)=>print("ERROR $name => $e"));
   }
   
  
positive.code:   q.add(testing_helper(test_commands_one_by_one(),"one by one"));
    q.add(testing_helper(test_incr_cas(),"transation CAS"));
    q.add(testing_helper(test_incr_cas_multiple(10),"transation CAS multiple"));
    
    
    
    Future.wait(q).then((_){print("done");})
    .then((_){
  
negative.code:             }
            });
        });
      });
    });
  }
  
  /// test that Command can not be used during transation
  Future test_transactions_failing(){
    RedisConnection conn = new RedisConnection();
    const String key = "key_trans" ;
    return conn.connect('localhost',6379).then((Command command){   
      return command.multi().then((Transaction trans){
        trans.send_object(["SET",key,"0"]);
        try{
          command.send_object(["GET",key]); //this should throw
        }
        catch(e){
          return "OK";
        }
        throw "error : no error"; //I once saw this message in Windows and I liked it
      });
    });
  }
  
  /// test that Command can  be used after transation .exec
  Future test_transactions_command_usable(){
    RedisConnection conn = new RedisConnection();
    const String key = "key_trans" ;
    return conn.connect('localhost',6379).then((Command command){   
      return command.multi().then((Transaction trans){
        trans.send_object(["SET",key,"0"]);
        trans.send_object(["GET",key]).then((v){
          if(v != "0") throw "expecting 0 but got $v";
        });
        trans.exec();
        command.send_object(["GET",key]).then((v){
          if(v != "0") throw "expecting 0 but got $v";
        });
        return conn.close();
      });
    });
  }
  