FileDocCategorySizeDatePackage
TestStyleTextPropAtom.javaAPI DocApache Poi 3.0.130599Tue Jun 26 21:26:02 BST 2007org.apache.poi.hslf.record

TestStyleTextPropAtom

public class TestStyleTextPropAtom extends TestCase
Tests that StyleTextPropAtom works properly
author
Nick Burch (nick at torchbox dot com)

Fields Summary
private byte[]
data_a
From a real file: a paragraph with 4 different styles
private int
data_a_text_len
private byte[]
data_b
From a real file: 4 paragraphs with text in 4 different styles: left aligned+bold (30) centre aligned+italic+blue (28) right aligned+red (25) left aligned+underlined+larger font size (96) left aligned+underlined+larger font size+red (1)
private int
data_b_text_len
private byte[]
data_c
From a real file. Has a mask with more bits set than it actually has data for. Shouldn't do, but some real files do :(
private int
data_c_text_len
private byte[]
data_d
From a real file supplied for Bug 40143 by tales@great.ufc.br
private int
data_d_text_len
Constructors Summary
Methods Summary
public voidtest42677()
Check the test data for Bug 42677.

        int length = 18;
        byte[] data = {0x00, 0x00, (byte)0xA1, 0x0F, 0x28, 0x00, 0x00, 0x00,
                       0x13, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xF1 , 0x20 , 0x00, 0x00 , 0x00 , 0x00 ,
                       0x22 , 0x20 , 0x00 , 0x00 , 0x64 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xFF ,
                       0x00 , 0x00 , 0x13 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x63 , 0x00 ,
                       0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x0F , 0x00
        };
        StyleTextPropAtom stpa = new StyleTextPropAtom(data,0,data.length);
        stpa.setParentTextSize(length);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        stpa.writeOut(baos);
        byte[] b = baos.toByteArray();

        assertEquals(data.length, b.length);
        for(int i=0; i<data.length; i++) {
            assertEquals(data[i],b[i]);
        }

    
public voidtestBug40143()
Check the test data for Bug 40143.

        StyleTextPropAtom atom = new StyleTextPropAtom(data_d, 0, data_d.length);
        atom.setParentTextSize(data_d_text_len);

        TextPropCollection prprops = (TextPropCollection)atom.getParagraphStyles().getFirst();
        assertEquals(data_d_text_len+1, prprops.getCharactersCovered());
        assertEquals(1, prprops.getTextPropList().size()); //1 property found
        assertEquals(1, prprops.findByName("alignment").getValue());

        TextPropCollection chprops = (TextPropCollection)atom.getCharacterStyles().getFirst();
        assertEquals(data_d_text_len+1, chprops.getCharactersCovered());
        assertEquals(5, chprops.getTextPropList().size()); //5 properties found
        assertEquals(1, chprops.findByName("char_flags").getValue());
        assertEquals(1, chprops.findByName("font.index").getValue());
        assertEquals(20, chprops.findByName("font.size").getValue());
        assertEquals(0, chprops.findByName("asian_or_complex").getValue());
        assertEquals(1, chprops.findByName("char_unknown_2").getValue());
    
public voidtestCharacterPropOrdering()

		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		stpb.setParentTextSize(data_b_text_len);

		LinkedList b_ch_l = stpb.getCharacterStyles();
		TextPropCollection b_ch_1 = (TextPropCollection)b_ch_l.get(0);
		TextPropCollection b_ch_2 = (TextPropCollection)b_ch_l.get(1);
		TextPropCollection b_ch_3 = (TextPropCollection)b_ch_l.get(2);
		TextPropCollection b_ch_4 = (TextPropCollection)b_ch_l.get(3);
		
		// In first set, we get a CharFlagsTextProp and a font.size
		assertEquals(2,b_ch_1.getTextPropList().size());
		TextProp tp_1_1 = (TextProp)b_ch_1.getTextPropList().get(0);
		TextProp tp_1_2 = (TextProp)b_ch_1.getTextPropList().get(1);
		assertEquals(true, tp_1_1 instanceof CharFlagsTextProp);
		assertEquals(true, tp_1_2 instanceof TextProp);
		assertEquals("font.size", tp_1_2.getName());
		assertEquals(20, tp_1_2.getValue());
		
		// In second set, we get a CharFlagsTextProp and a font.size and a font.color
		assertEquals(3,b_ch_2.getTextPropList().size());
		TextProp tp_2_1 = (TextProp)b_ch_2.getTextPropList().get(0);
		TextProp tp_2_2 = (TextProp)b_ch_2.getTextPropList().get(1);
		TextProp tp_2_3 = (TextProp)b_ch_2.getTextPropList().get(2);
		assertEquals(true, tp_2_1 instanceof CharFlagsTextProp);
		assertEquals(true, tp_2_2 instanceof TextProp);
		assertEquals(true, tp_2_3 instanceof TextProp);
		assertEquals("font.size", tp_2_2.getName());
		assertEquals("font.color", tp_2_3.getName());
		assertEquals(20, tp_2_2.getValue());
		
		// In third set, it's just a font.size and a font.color
		assertEquals(2,b_ch_3.getTextPropList().size());
		TextProp tp_3_1 = (TextProp)b_ch_3.getTextPropList().get(0);
		TextProp tp_3_2 = (TextProp)b_ch_3.getTextPropList().get(1);
		assertEquals(true, tp_3_1 instanceof TextProp);
		assertEquals(true, tp_3_2 instanceof TextProp);
		assertEquals("font.size", tp_3_1.getName());
		assertEquals("font.color", tp_3_2.getName());
		assertEquals(20, tp_3_1.getValue());
		
		// In fourth set, we get a CharFlagsTextProp and a font.index and a font.size
		assertEquals(3,b_ch_4.getTextPropList().size());
		TextProp tp_4_1 = (TextProp)b_ch_4.getTextPropList().get(0);
		TextProp tp_4_2 = (TextProp)b_ch_4.getTextPropList().get(1);
		TextProp tp_4_3 = (TextProp)b_ch_4.getTextPropList().get(2);
		assertEquals(true, tp_4_1 instanceof CharFlagsTextProp);
		assertEquals(true, tp_4_2 instanceof TextProp);
		assertEquals(true, tp_4_3 instanceof TextProp);
		assertEquals("font.index", tp_4_2.getName());
		assertEquals("font.size", tp_4_3.getName());
		assertEquals(24, tp_4_3.getValue());
	
public voidtestCharacterProps()

		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		stpb.setParentTextSize(data_b_text_len);

		LinkedList b_ch_l = stpb.getCharacterStyles();
		TextPropCollection b_ch_1 = (TextPropCollection)b_ch_l.get(0);
		TextPropCollection b_ch_2 = (TextPropCollection)b_ch_l.get(1);
		TextPropCollection b_ch_3 = (TextPropCollection)b_ch_l.get(2);
		TextPropCollection b_ch_4 = (TextPropCollection)b_ch_l.get(3);

		// 1st is bold
		CharFlagsTextProp cf_1_1 = (CharFlagsTextProp)b_ch_1.getTextPropList().get(0);
		assertEquals(true,cf_1_1.getSubValue(CharFlagsTextProp.BOLD_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.ITALIC_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_1_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_2_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.RELIEF_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.RESET_NUMBERING_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.SHADOW_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.STRIKETHROUGH_IDX));
		assertEquals(false,cf_1_1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));
		
		// 2nd is italic
		CharFlagsTextProp cf_2_1 = (CharFlagsTextProp)b_ch_2.getTextPropList().get(0);
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.BOLD_IDX));
		assertEquals(true,cf_2_1.getSubValue(CharFlagsTextProp.ITALIC_IDX));
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_1_IDX));
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_2_IDX));
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.RELIEF_IDX));
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.RESET_NUMBERING_IDX));
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.SHADOW_IDX));
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.STRIKETHROUGH_IDX));
		assertEquals(false,cf_2_1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));

		// 3rd is normal, so lacks a CharFlagsTextProp
		assertFalse(b_ch_3.getTextPropList().get(0) instanceof CharFlagsTextProp);
		
		// 4th is underlined
		CharFlagsTextProp cf_4_1 = (CharFlagsTextProp)b_ch_4.getTextPropList().get(0);
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.BOLD_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.ITALIC_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_1_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_2_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.RELIEF_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.RESET_NUMBERING_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.SHADOW_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.STRIKETHROUGH_IDX));
		assertEquals(true,cf_4_1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));
		
		// The value for this should be 4
		assertEquals(0x0004, cf_4_1.getValue());
		
		// Now make the 4th bold, italic and not underlined
		cf_4_1.setSubValue(true, CharFlagsTextProp.BOLD_IDX);
		cf_4_1.setSubValue(true, CharFlagsTextProp.ITALIC_IDX);
		cf_4_1.setSubValue(false, CharFlagsTextProp.UNDERLINE_IDX);
		
		assertEquals(true,cf_4_1.getSubValue(CharFlagsTextProp.BOLD_IDX));
		assertEquals(true,cf_4_1.getSubValue(CharFlagsTextProp.ITALIC_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_1_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.ENABLE_NUMBERING_2_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.RELIEF_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.RESET_NUMBERING_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.SHADOW_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.STRIKETHROUGH_IDX));
		assertEquals(false,cf_4_1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));
		
		// The value should now be 3
		assertEquals(0x0003, cf_4_1.getValue());
	
public voidtestCharacterStyleCounts()

		StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);

		// Set for the appropriate text sizes
		stpa.setParentTextSize(data_a_text_len);
		stpb.setParentTextSize(data_b_text_len);

		// In case A, there is a single styling of the characters
		assertEquals(3, stpa.getCharacterStyles().size());
		// In case B, there are 5 different stylings
		assertEquals(5, stpb.getCharacterStyles().size());
	
public voidtestCharacterStyleLengths()

		StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);

		// Set for the appropriate text sizes
		stpa.setParentTextSize(data_a_text_len);
		stpb.setParentTextSize(data_b_text_len);

		// 54 chars, 21 + 17 + 16
		LinkedList a_ch_l = stpa.getCharacterStyles();
		TextPropCollection a_ch_1 = (TextPropCollection)a_ch_l.get(0);
		TextPropCollection a_ch_2 = (TextPropCollection)a_ch_l.get(1);
		TextPropCollection a_ch_3 = (TextPropCollection)a_ch_l.get(2);
		assertEquals(21, a_ch_1.getCharactersCovered());
		assertEquals(17, a_ch_2.getCharactersCovered());
		assertEquals(16, a_ch_3.getCharactersCovered());

		// 179 chars, 30 + 28 + 25
		LinkedList b_ch_l = stpb.getCharacterStyles();
		TextPropCollection b_ch_1 = (TextPropCollection)b_ch_l.get(0);
		TextPropCollection b_ch_2 = (TextPropCollection)b_ch_l.get(1);
		TextPropCollection b_ch_3 = (TextPropCollection)b_ch_l.get(2);
		TextPropCollection b_ch_4 = (TextPropCollection)b_ch_l.get(3);
		assertEquals(30, b_ch_1.getCharactersCovered());
		assertEquals(28, b_ch_2.getCharactersCovered());
		assertEquals(25, b_ch_3.getCharactersCovered());
		assertEquals(96, b_ch_4.getCharactersCovered());
	
public voidtestCreateAFromScatch()
Try to recreate an existing StyleTextPropAtom (a) from the empty constructor, and setting the required properties

		// Start with an empty one
		StyleTextPropAtom stpa = new StyleTextPropAtom(54);
		
		// Don't need to touch the paragraph styles
		// Add two more character styles
		LinkedList cs = stpa.getCharacterStyles();
		
		// First char style is boring, and 21 long
		TextPropCollection tpca = (TextPropCollection)cs.get(0);
		tpca.updateTextSize(21);
		
		// Second char style is coloured, 00 00 00 05, and 17 long
		TextPropCollection tpcb = stpa.addCharacterTextPropCollection(17);
		TextProp tpb = tpcb.addWithName("font.color");
		tpb.setValue(0x05000000);
		
		// Third char style is coloured, FF 33 00 FE, and 16 long
		TextPropCollection tpcc = stpa.addCharacterTextPropCollection(16);
		TextProp tpc = tpcc.addWithName("font.color");
		tpc.setValue(0xFE0033FF);
		
		// Should now be the same as data_a
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		stpa.writeOut(baos);
		byte[] b = baos.toByteArray();

		assertEquals(data_a.length, b.length);
		for(int i=0; i<data_a.length; i++) {
			assertEquals(data_a[i],b[i]);
		}
	
public voidtestCreateBFromScatch()
Try to recreate an existing StyleTextPropAtom (b) from the empty constructor, and setting the required properties

		// Start with an empty one
		StyleTextPropAtom stpa = new StyleTextPropAtom(data_b_text_len);
		
		
		// Need 4 paragraph styles
		LinkedList ps = stpa.getParagraphStyles();
		
		// First is 30 long, left aligned, normal spacing
		TextPropCollection tppa = (TextPropCollection)ps.get(0);
		tppa.updateTextSize(30);
		
		TextProp tp = tppa.addWithName("alignment");
		tp.setValue(0);
		tp = tppa.addWithName("linespacing");
		tp.setValue(80);

		// Second is 28 long, centre aligned and normal spacing
		TextPropCollection tppb = stpa.addParagraphTextPropCollection(28);
		
		tp = tppb.addWithName("linespacing");
		tp.setValue(80);
		
		// Third is 25 long, right aligned and normal spacing
		TextPropCollection tppc = stpa.addParagraphTextPropCollection(25);
		
		tp = tppc.addWithName("alignment");
		tp.setValue(2);
		tp = tppc.addWithName("linespacing");
		tp.setValue(80);
		
		// Forth is left aligned + normal line spacing (despite differing font)
		TextPropCollection tppd = stpa.addParagraphTextPropCollection(97);
		
		tp = tppd.addWithName("alignment");
		tp.setValue(0);
		tp = tppd.addWithName("linespacing");
		tp.setValue(80);
		
		
		// Now do 4 character styles
		LinkedList cs = stpa.getCharacterStyles();
		
		// First is 30 long, bold and font size
		TextPropCollection tpca = (TextPropCollection)cs.get(0);
		tpca.updateTextSize(30);
		
		tp = tpca.addWithName("font.size");
		tp.setValue(20);
		CharFlagsTextProp cftp = (CharFlagsTextProp)
			tpca.addWithName("char_flags");
		assertEquals(0, cftp.getValue());
		cftp.setSubValue(true, CharFlagsTextProp.BOLD_IDX);
		assertEquals(1, cftp.getValue());
		
		// Second is 28 long, blue and italic
		TextPropCollection tpcb = stpa.addCharacterTextPropCollection(28);
		
		tp = tpcb.addWithName("font.size");
		tp.setValue(20);
		tp = tpcb.addWithName("font.color");
		tp.setValue(0x05000000);
		cftp = (CharFlagsTextProp)tpcb.addWithName("char_flags");
		cftp.setSubValue(true, CharFlagsTextProp.ITALIC_IDX);
		assertEquals(2, cftp.getValue());
		
		// Third is 25 long and red
		TextPropCollection tpcc = stpa.addCharacterTextPropCollection(25);
		
		tp = tpcc.addWithName("font.size");
		tp.setValue(20);
		tp = tpcc.addWithName("font.color");
		tp.setValue(0xfe0033ff);
		
		// Fourth is 96 long, underlined and different+bigger font 
		TextPropCollection tpcd = stpa.addCharacterTextPropCollection(96);
		
		tp = tpcd.addWithName("font.size");
		tp.setValue(24);
		tp = tpcd.addWithName("font.index");
		tp.setValue(1);
		cftp = (CharFlagsTextProp)tpcd.addWithName("char_flags");
		cftp.setSubValue(true, CharFlagsTextProp.UNDERLINE_IDX);
		assertEquals(4, cftp.getValue());
		
		// Fifth is 1 long, underlined and different+bigger font + red
		TextPropCollection tpce = stpa.addCharacterTextPropCollection(1);
		
		tp = tpce.addWithName("font.size");
		tp.setValue(24);
		tp = tpce.addWithName("font.index");
		tp.setValue(1);
		tp = tpce.addWithName("font.color");
		tp.setValue(0xfe0033ff);
		cftp = (CharFlagsTextProp)tpce.addWithName("char_flags");
		cftp.setSubValue(true, CharFlagsTextProp.UNDERLINE_IDX);
		assertEquals(4, cftp.getValue());
		
		
		// Check it's as expected
		assertEquals(4, stpa.getParagraphStyles().size());
		assertEquals(5, stpa.getCharacterStyles().size());
		
		// Compare in detail to b
		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		stpb.setParentTextSize(data_b_text_len);
		LinkedList psb = stpb.getParagraphStyles();
		LinkedList csb = stpb.getCharacterStyles();
		
		assertEquals(psb.size(), ps.size());
		assertEquals(csb.size(), cs.size());
		
		// Ensure Paragraph Character styles match
		for(int z=0; z<2; z++) {
			LinkedList lla = cs; 
			LinkedList llb = csb;
			int upto = 5;
			if(z == 1) {
				lla = ps;
				llb = psb;
				upto = 4;
			}
			
			for(int i=0; i<upto; i++) {
				TextPropCollection ca = (TextPropCollection)lla.get(i);
				TextPropCollection cb = (TextPropCollection)llb.get(i);
				
				assertEquals(ca.getCharactersCovered(), cb.getCharactersCovered());
				assertEquals(ca.getTextPropList().size(), cb.getTextPropList().size());
				
				for(int j=0; j<ca.getTextPropList().size(); j++) {
					TextProp tpa = (TextProp)ca.getTextPropList().get(j);
					TextProp tpb = (TextProp)cb.getTextPropList().get(j);
					//System.out.println("TP " + i + " " + j + " " + tpa.getName() + "\t" + tpa.getValue() );
					assertEquals(tpa.getName(), tpb.getName());
					assertEquals(tpa.getMask(), tpb.getMask());
					assertEquals(tpa.getWriteMask(), tpb.getWriteMask());
					assertEquals(tpa.getValue(), tpb.getValue());
				}
				
				ByteArrayOutputStream ba = new ByteArrayOutputStream();
				ByteArrayOutputStream bb = new ByteArrayOutputStream();
				
				ca.writeOut(ba);
				cb.writeOut(bb);
				byte[] cab = ba.toByteArray(); 
				byte[] cbb = bb.toByteArray();
				
				assertEquals(cbb.length, cab.length);
				for(int j=0; j<cab.length; j++) {
					//System.out.println("On tp " + z + " " + i + " " + j + "\t" + cab[j] + "\t" + cbb[j]);
					assertEquals(cbb[j], cab[j]);
				}
			}
		}
		

		
		// Check byte level with b
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		stpa.writeOut(baos);
		byte[] b = baos.toByteArray();

		assertEquals(data_b.length, b.length);
		for(int i=0; i<data_b.length; i++) {
			System.out.println(i + "\t" + b[i] + "\t" + data_b[i] + "\t" + Integer.toHexString(b[i]) );
			assertEquals(data_b[i],b[i]);
		}
	
public voidtestFindAddTextProp()

		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		stpb.setParentTextSize(data_b_text_len);

		LinkedList b_p_l = stpb.getParagraphStyles();
		TextPropCollection b_p_1 = (TextPropCollection)b_p_l.get(0);
		TextPropCollection b_p_2 = (TextPropCollection)b_p_l.get(1);
		TextPropCollection b_p_3 = (TextPropCollection)b_p_l.get(2);
		TextPropCollection b_p_4 = (TextPropCollection)b_p_l.get(3);
		
		LinkedList b_ch_l = stpb.getCharacterStyles();
		TextPropCollection b_ch_1 = (TextPropCollection)b_ch_l.get(0);
		TextPropCollection b_ch_2 = (TextPropCollection)b_ch_l.get(1);
		TextPropCollection b_ch_3 = (TextPropCollection)b_ch_l.get(2);
		TextPropCollection b_ch_4 = (TextPropCollection)b_ch_l.get(3);

		// CharFlagsTextProp: 3 doesn't have, 4 does
		assertNull(b_ch_3.findByName("char_flags"));
		assertNotNull(b_ch_4.findByName("char_flags"));
		
		// Now add in on 3, should go to front
		assertEquals(2, b_ch_3.getTextPropList().size());
		TextProp new_cftp = b_ch_3.addWithName("char_flags");
		assertEquals(3, b_ch_3.getTextPropList().size());
		assertEquals(new_cftp, b_ch_3.getTextPropList().get(0));
		
		// alignment: 1 does have, 2 doesn't
		assertNotNull(b_p_1.findByName("alignment"));
		assertNull(b_p_2.findByName("alignment"));
		
		// Now add in on 2, should go to the front
		assertEquals(1, b_p_2.getTextPropList().size());
		TextProp new_al = b_p_2.addWithName("alignment");
		assertEquals(2, b_p_2.getTextPropList().size());
		assertEquals(new_al, b_p_2.getTextPropList().get(0));
		
		// This should go at the end
		TextProp new_sa = b_p_2.addWithName("spaceafter");
		assertEquals(3, b_p_2.getTextPropList().size());
		assertEquals(new_sa, b_p_2.getTextPropList().get(2));
		
		// Check we get an error with a made up one
		try {
			b_p_2.addWithName("madeUpOne");
			fail();
		} catch(IllegalArgumentException e) {
			// Good, as expected
		}
	
public voidtestLoadWriteA()

		StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
		stpa.setParentTextSize(data_a_text_len);

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		stpa.writeOut(baos);
		byte[] b = baos.toByteArray();

		assertEquals(data_a.length, b.length);
		for(int i=0; i<data_a.length; i++) {
			assertEquals(data_a[i],b[i]);
		}
	
public voidtestLoadWriteB()

		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		stpb.setParentTextSize(data_b_text_len);

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		stpb.writeOut(baos);
		byte[] b = baos.toByteArray();

		assertEquals(data_b.length, b.length);
		for(int i=0; i<data_b.length; i++) {
			//System.out.println(i + "\t" + b[i] + "\t" + data_b[i] + "\t" + Integer.toHexString(b[i]) );
			assertEquals(data_b[i],b[i]);
		}
	
public voidtestNotEnoughDataProp()

		// We don't have enough data in the record to cover
		//  all the properties the mask says we have
		// Make sure we just do the best we can
		StyleTextPropAtom stpc = new StyleTextPropAtom(data_c,0,data_c.length);
		stpc.setParentTextSize(data_c_text_len);
		
		// If we get here, we didn't break
	
public voidtestParagraphProps()

		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		stpb.setParentTextSize(data_b_text_len);
		
		LinkedList b_p_l = stpb.getParagraphStyles();
		TextPropCollection b_p_1 = (TextPropCollection)b_p_l.get(0);
		TextPropCollection b_p_2 = (TextPropCollection)b_p_l.get(1);
		TextPropCollection b_p_3 = (TextPropCollection)b_p_l.get(2);
		TextPropCollection b_p_4 = (TextPropCollection)b_p_l.get(3);
		
		// 1st is left aligned + normal line spacing
		assertEquals(2,b_p_1.getTextPropList().size());
		TextProp tp_1_1 = (TextProp)b_p_1.getTextPropList().get(0);
		TextProp tp_1_2 = (TextProp)b_p_1.getTextPropList().get(1);
		assertEquals(true, tp_1_1 instanceof TextProp);
		assertEquals(true, tp_1_2 instanceof TextProp);
		assertEquals("alignment", tp_1_1.getName());
		assertEquals("linespacing", tp_1_2.getName());
		assertEquals(0, tp_1_1.getValue());
		assertEquals(80, tp_1_2.getValue());
		
		// 2nd is centre aligned (default) + normal line spacing
		assertEquals(1,b_p_2.getTextPropList().size());
		TextProp tp_2_1 = (TextProp)b_p_2.getTextPropList().get(0);
		assertEquals(true, tp_2_1 instanceof TextProp);
		assertEquals(true, tp_1_2 instanceof TextProp);
		assertEquals("linespacing", tp_2_1.getName());
		assertEquals(80, tp_2_1.getValue());
		
		// 3rd is right aligned + normal line spacing
		assertEquals(2,b_p_3.getTextPropList().size());
		TextProp tp_3_1 = (TextProp)b_p_3.getTextPropList().get(0);
		TextProp tp_3_2 = (TextProp)b_p_3.getTextPropList().get(1);
		assertEquals(true, tp_3_1 instanceof TextProp);
		assertEquals(true, tp_3_2 instanceof TextProp);
		assertEquals("alignment", tp_3_1.getName());
		assertEquals("linespacing", tp_3_2.getName());
		assertEquals(2, tp_3_1.getValue());
		assertEquals(80, tp_3_2.getValue());
		
		// 4st is left aligned + normal line spacing (despite differing font)
		assertEquals(2,b_p_4.getTextPropList().size());
		TextProp tp_4_1 = (TextProp)b_p_4.getTextPropList().get(0);
		TextProp tp_4_2 = (TextProp)b_p_4.getTextPropList().get(1);
		assertEquals(true, tp_4_1 instanceof TextProp);
		assertEquals(true, tp_4_2 instanceof TextProp);
		assertEquals("alignment", tp_4_1.getName());
		assertEquals("linespacing", tp_4_2.getName());
		assertEquals(0, tp_4_1.getValue());
		assertEquals(80, tp_4_2.getValue());
	
public voidtestParagraphStyleCounts()

		StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);

		// Set for the appropriate text sizes
		stpa.setParentTextSize(data_a_text_len);
		stpb.setParentTextSize(data_b_text_len);

		// In case A, all has the same spacing and alignment
		assertEquals(1, stpa.getParagraphStyles().size());
		// In case B, all 4 sets have different alignments
		assertEquals(4, stpb.getParagraphStyles().size());
	
public voidtestRecordType()


         
		StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		StyleTextPropAtom stpc = new StyleTextPropAtom(data_c,0,data_c.length);
		assertEquals(4001l, stpa.getRecordType());
		assertEquals(4001l, stpb.getRecordType());
		assertEquals(4001l, stpc.getRecordType());
	
public voidtestWriteA()

		StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		stpa.writeOut(baos);
		byte[] b = baos.toByteArray();

		assertEquals(data_a.length, b.length);
		for(int i=0; i<data_a.length; i++) {
			assertEquals(data_a[i],b[i]);
		}
	
public voidtestWriteB()

		StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		stpb.writeOut(baos);
		byte[] b = baos.toByteArray();

		assertEquals(data_b.length, b.length);
		for(int i=0; i<data_b.length; i++) {
			assertEquals(data_b[i],b[i]);
		}