delete_values() fix bug #20681.

    (#20681) fix behaviour of delete_values
    
    The issue #20681 describe the error of delete() function
    removing the elements from the origin array/hash/string.
    
    This issue affected other delete functions. Because
    ruby delete and delete_if functions make destructive
    changes to the origin array/hash.
    
    The delete_undef_values removed elements from the
    origin hash and this is not the desired behaviour.
    
    To solve this, we should dup or clone the hash
    before using the delete or delete_if ruby functions.
    
    This fix the problem and add unit tests, so we could
    enforce this behaviour and prevent regressions.