--- /dev/null
+#!/usr/bin/env ruby
+
+# Copyright (C) 2011 Martin A. Hansen.
+
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# http://www.gnu.org/copyleft/gpl.html
+
+# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+# This software is part of the Biopieces framework (www.biopieces.org).
+
+# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+require 'test/unit'
+require 'maasha/sam'
+require 'pp'
+require 'stringio'
+
+SAM_TEST =
+%{@HD\tVN:1.3\tSO:coordinate
+@SQ\tSN:ref\tLN:45
+@CO\tMyComment
+r001\t163\tref\t7\t30\t8M2I4M1D3M\t=\t37\t39\tTTAGATAAAGGATACTG\t*
+r002\t0\tref\t9\t30\t3S6M1P1I4M\t*\t0\t0\tAAAAGATAAGGATA\t*
+r003\t0\tref\t9\t30\t5H6M\t*\t0\t0\tAGCTAA\t*\tNM:i:1
+r004\t0\tref\t16\t30\t6M14N5M\t*\t0\t0\tATAGCTTCAGC\t*
+r003\t16\tref\t29\t30\t6H5M\t*\t0\t0\tTAGGC\t*\tNM:i:0
+r001\t83\tref\t37\t30\t9M\t=\t7\t-39\tCAGCGCCAT\t*
+}
+
+class SamTest < Test::Unit::TestCase
+ def setup
+ @sam = Sam.new(StringIO.new(SAM_TEST))
+ end
+
+# def test_Sam_header_without_entry_returns_nil
+# @sam.io = StringIO.new
+# assert_nil(@sam.header)
+# end
+
+ def test_Sam_header_parse_with_missing_version_number_raises
+ sam = Sam.new(StringIO.new("@HD"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_version_number_raises
+ sam = Sam.new(StringIO.new("@HD\tXN:1.3"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_version_number_returns_correctly
+ sam = Sam.new(StringIO.new("@HD\tVN:1.3"))
+ assert_equal(1.3, sam.header[:HD][:VN])
+ end
+
+ def test_Sam_header_parse_with_bad_sort_order_raises
+ sam = Sam.new(StringIO.new("@HD\tVN:1.3\tSO:fish"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_sort_order_returns_correctly
+ %w{unknown unsorted queryname coordinate}.each do |order|
+ sam = Sam.new(StringIO.new("@HD\tVN:1.3\tSO:#{order}"))
+ assert_equal(order, sam.header[:HD][:SO])
+ end
+ end
+
+ def test_Sam_header_parse_with_missing_sequence_name_raises
+ sam = Sam.new(StringIO.new("@SQ"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_sequence_name_raises
+ sam = Sam.new(StringIO.new("@SQ\tSN:"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_sequence_name_returns_correctly
+ sam = Sam.new(StringIO.new("@SQ\tSN:ref\tLN:45"))
+ assert_equal({:LN=>45}, sam.header[:SQ][:SN][:ref])
+ end
+
+ def test_Sam_header_parse_with_duplicate_sequence_name_raises
+ sam = Sam.new(StringIO.new("@SQ\tSN:ref\n@SQ\tSN:ref"))
+ assert_raise(SamError) { sam.header[:SQ][:SN][:ref] }
+ end
+
+ def test_Sam_header_parse_with_missing_sequence_length_raises
+ sam = Sam.new(StringIO.new("@SQ\tSN:ref"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_sequence_length_raises
+ sam = Sam.new(StringIO.new("@SQ\tSN:scaffold17_1_MH0083\tLN:x"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_sequence_length_returns_correctly
+ sam = Sam.new(StringIO.new("@SQ\tSN:scaffold17_1_MH0083\tLN:995"))
+ assert_equal(995, sam.header[:SQ][:SN][:scaffold17_1_MH0083][:LN])
+ end
+
+ def test_Sam_header_parse_with_full_SQ_dont_raise
+ sam = Sam.new("@SQ\tSN:ref\tLN:45\tAS:ident\tM5:87e6b2aedf51b1f9c89becfab9267f41\tSP:E.coli\tUR:http://www.biopieces.org")
+ assert_nothing_raised { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_read_group_identifier_raises
+ sam = Sam.new(StringIO.new("@RG\tID:"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_missing_read_group_identifier_raises
+ sam = Sam.new(StringIO.new("@RG"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_duplicate_read_group_identifier_raises
+ sam = Sam.new(StringIO.new("@RG\tID:123\n@RG\tID:123"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_read_group_identifier_dont_raise
+ sam = Sam.new(StringIO.new("@RG\tID:123\n@RG\tID:124"))
+ assert_nothing_raised { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_flow_order_raises
+ sam = Sam.new(StringIO.new("@RG\tID:123\tFO:3"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_flow_order_dont_raise
+ sam = Sam.new(StringIO.new("@RG\tID:123\tFO:*"))
+ assert_nothing_raised { sam.header }
+ sam = Sam.new(StringIO.new("@RG\tID:123\tFO:ACMGRSVTWYHKDBN"))
+ assert_nothing_raised { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_platform_raises
+ sam = Sam.new(StringIO.new("@RG\tID:123\tPL:maersk"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_platform_dont_raise
+ sam = Sam.new(StringIO.new("@RG\tID:123\tPL:ILLUMINA"))
+ assert_nothing_raised { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_program_identifier_raises
+ sam = Sam.new(StringIO.new("@PG\tID:"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_missing_program_identifier_raises
+ sam = Sam.new(StringIO.new("@PG"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_duplicate_program_identifier_raises
+ sam = Sam.new(StringIO.new("@PG\tID:123\n@PG\tID:123"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_bad_comment_raises
+ sam = Sam.new(StringIO.new("@CO\t"))
+ assert_raise(SamError) { sam.header }
+ end
+
+ def test_Sam_header_parse_with_ok_comment_dont_raise
+ sam = Sam.new(StringIO.new("@CO\tfubar"))
+ assert_nothing_raised { sam.header }
+ end
+end
+