Unclear effect of DuplicatesStrategy.FAIL in copy method

This is a follow-up post to Copy method seems to ignore duplicatesStrategy

I’m still a bit confused about what is considered duplicates and what is not. For example, consider the following build.gradle file:

def f = file('build.gradle')

task example1 << {
  copy {
    from([f, f])
    duplicatesStrategy = DuplicatesStrategy.FAIL
    into temporaryDir
  }
}

task example2 << {
  copy {
    from f
    from f
    duplicatesStrategy = DuplicatesStrategy.FAIL
    into temporaryDir
  }
}

task example3 << {
  def copyOps = [[source: f, target: 'bar'], [source: f, target: 'bar']]
  copy {
    duplicatesStrategy = DuplicatesStrategy.FAIL
    into temporaryDir
    copyOps.each { op->
      from op.source, {
        rename {
          op.target
        }
      }
    }
  }
}

gradle example1 reports a duplicate path whereas gradle example2 does not. gradle example3 again does.