require 'minitest/autorun'
def parse_fat
#--------------
m=gets
s=->b,l{b.slice!(0,l).to_i 2}
t=->b{'%02d:%02d:%02d %d/%d/%d'%[s[b,5],s[b,6],2*s[b,5],s[b,7]+1980,s[b,4],s[b,5],]}
i=(0..q=32).map{|i|m[i*8,8].to_i 2}
c=i.map(&:chr).join
n=c[0,8].strip
e=c[8,3].strip
e>?!&&n<<?.+e
f=''
6.times{|j|i[11][j]>0&&f<<%w(RO H S VL SD A)[j]}
$><<[n,f,t[m[112,q]],t[m[176,q]],(f[/VL|SD/]?0:m[-q,q].to_i(2))]*' '
#--------------
end
describe 'msdos_fat_parser' do
it 'can parse files' do
file_descriptor = '0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000'
expected = 'programm.ing HS 20:18:08 2016/6/20 20:18:08 2016/6/20 53248'
assert_equal expected, call_parse_fat(file_descriptor)
end
it 'can parse non-files' do
file_descriptor = '0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001'
expected = 'ppcg SSD 11:43:24 2010/12/31 20:18:08 2016/6/20 0'
assert_equal expected, call_parse_fat(file_descriptor)
end
def call_parse_fat(bit_string)
capture_stdout(bit_string){ parse_fat }
end
end
# capture STDIN/STDOUT for testing purposes
require 'stringio'
module Kernel
def capture_stdout(console_input = '')
$stdin = StringIO.new(console_input)
out = StringIO.new
$stdout = out
yield
return out.string.chomp
ensure
$stdout = STDOUT
$stdin = STDIN
end
end
cmVxdWlyZSAnbWluaXRlc3QvYXV0b3J1bicKCmRlZiBwYXJzZV9mYXQKIy0tLS0tLS0tLS0tLS0tCm09Z2V0cwpzPS0+Yixse2Iuc2xpY2UhKDAsbCkudG9faSAyfQp0PS0+YnsnJTAyZDolMDJkOiUwMmQgJWQvJWQvJWQnJVtzW2IsNV0sc1tiLDZdLDIqc1tiLDVdLHNbYiw3XSsxOTgwLHNbYiw0XSxzW2IsNV0sXX0KaT0oMC4ucT0zMikubWFwe3xpfG1baSo4LDhdLnRvX2kgMn0KYz1pLm1hcCgmOmNocikuam9pbgpuPWNbMCw4XS5zdHJpcAplPWNbOCwzXS5zdHJpcAplPj8hJiZuPDw/LitlCmY9JycKNi50aW1lc3t8anxpWzExXVtqXT4wJiZmPDwldyhSTyBIIFMgVkwgU0QgQSlbal19CiQ+PDxbbixmLHRbbVsxMTIscV1dLHRbbVsxNzYscV1dLChmWy9WTHxTRC9dPzA6bVstcSxxXS50b19pKDIpKV0qJyAnCiMtLS0tLS0tLS0tLS0tLQplbmQKCmRlc2NyaWJlICdtc2Rvc19mYXRfcGFyc2VyJyBkbwogIGl0ICdjYW4gcGFyc2UgZmlsZXMnIGRvCiAgICBmaWxlX2Rlc2NyaXB0b3IgPSAnMDExMTAwMDAwMTExMDAxMDAxMTAxMTExMDExMDAxMTEwMTExMDAxMDAxMTAwMDAxMDExMDExMDEwMTEwMTEwMTAxMTAxMDAxMDExMDExMTAwMTEwMDExMTAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDEwMTAwMDEwMDEwMDAxMDAwMTAwMTAwMDExMDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMDAxMDAxMDAwMTAwMDEwMDEwMDAxMTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMTAwMDAwMDAwMDAwMCcKICAgIGV4cGVjdGVkID0gJ3Byb2dyYW1tLmluZyBIUyAyMDoxODowOCAyMDE2LzYvMjAgMjA6MTg6MDggMjAxNi82LzIwIDUzMjQ4JwogICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBjYWxsX3BhcnNlX2ZhdChmaWxlX2Rlc2NyaXB0b3IpCiAgZW5kCgogIGl0ICdjYW4gcGFyc2Ugbm9uLWZpbGVzJyBkbwogICAgZmlsZV9kZXNjcmlwdG9yID0gJzAwMTAwMDAwMDAxMDAwMDAwMDEwMDAwMDAwMTAwMDAwMDExMTAwMDAwMTExMDAwMDAxMTAwMDExMDExMDAxMTEwMDEwMDAwMDAwMTAwMDAwMDAxMDAwMDAwMDAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMTEwMTAxMTAxMTAwMDAxMTExMDExMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMDAwMTAwMTAwMDEwMDAxMDAxMDAwMTEwMTAxMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAxMTExMTEwMDEwMTExMDAwMDEnCgogICAgZXhwZWN0ZWQgPSAncHBjZyBTU0QgMTE6NDM6MjQgMjAxMC8xMi8zMSAyMDoxODowOCAyMDE2LzYvMjAgMCcKICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgY2FsbF9wYXJzZV9mYXQoZmlsZV9kZXNjcmlwdG9yKQogIGVuZAoKICBkZWYgY2FsbF9wYXJzZV9mYXQoYml0X3N0cmluZykKICAgIGNhcHR1cmVfc3Rkb3V0KGJpdF9zdHJpbmcpeyBwYXJzZV9mYXQgfQogIGVuZAplbmQKCiMgY2FwdHVyZSBTVERJTi9TVERPVVQgZm9yIHRlc3RpbmcgcHVycG9zZXMKcmVxdWlyZSAnc3RyaW5naW8nCm1vZHVsZSBLZXJuZWwKICBkZWYgY2FwdHVyZV9zdGRvdXQoY29uc29sZV9pbnB1dCA9ICcnKQogICAgJHN0ZGluID0gU3RyaW5nSU8ubmV3KGNvbnNvbGVfaW5wdXQpCiAgICBvdXQgPSBTdHJpbmdJTy5uZXcKICAgICRzdGRvdXQgPSBvdXQKICAgIHlpZWxkCiAgICByZXR1cm4gb3V0LnN0cmluZy5jaG9tcAogIGVuc3VyZQogICAgJHN0ZG91dCA9IFNURE9VVAogICAgJHN0ZGluID0gU1RESU4KICBlbmQKZW5kCgo=