public void testCreateCFRuleRecord() {
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet();
    CFRuleRecord record = CFRuleRecord.create(sheet, "7");
    testCFRuleRecord(record);

    // Serialize
    byte[] serializedRecord = record.serialize();

    // Strip header
    byte[] recordData = new byte[serializedRecord.length - 4];
    System.arraycopy(serializedRecord, 4, recordData, 0, recordData.length);

    // Deserialize
    record = new CFRuleRecord(TestcaseRecordInputStream.create(CFRuleRecord.sid, recordData));

    // Serialize again
    byte[] output = record.serialize();

    // Compare
    assertEquals("Output size", recordData.length + 4, output.length); // includes sid+recordlength

    for (int i = 0; i < recordData.length; i++) {
      assertEquals("CFRuleRecord doesn't match", recordData[i], output[i + 4]);
    }
  }
  /** tRefN and tAreaN tokens must be preserved when re-serializing conditional format formulas */
  public void testReserializeRefNTokens() {

    RecordInputStream is = TestcaseRecordInputStream.create(CFRuleRecord.sid, DATA_REFN);
    CFRuleRecord rr = new CFRuleRecord(is);
    Ptg[] ptgs = rr.getParsedExpression1();
    assertEquals(3, ptgs.length);
    if (ptgs[0] instanceof RefPtg) {
      throw new AssertionFailedError("Identified bug 45234");
    }
    assertEquals(RefNPtg.class, ptgs[0].getClass());
    RefNPtg refNPtg = (RefNPtg) ptgs[0];
    assertTrue(refNPtg.isColRelative());
    assertTrue(refNPtg.isRowRelative());

    byte[] data = rr.serialize();
    TestcaseRecordInputStream.confirmRecordEncoding(CFRuleRecord.sid, DATA_REFN, data);
  }
  public void testWrite() {
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet();
    CFRuleRecord rr = CFRuleRecord.create(sheet, ComparisonOperator.BETWEEN, "5", "10");

    PatternFormatting patternFormatting = new PatternFormatting();
    patternFormatting.setFillPattern(PatternFormatting.BRICKS);
    rr.setPatternFormatting(patternFormatting);

    byte[] data = rr.serialize();
    assertEquals(26, data.length);
    assertEquals(3, LittleEndian.getShort(data, 6));
    assertEquals(3, LittleEndian.getShort(data, 8));

    int flags = LittleEndian.getInt(data, 10);
    assertEquals("unused flags should be 111", 0x00380000, flags & 0x00380000);
    assertEquals(
        "undocumented flags should be 0000", 0, flags & 0x03C00000); // Otherwise Excel gets unhappy
    // check all remaining flag bits (some are not well understood yet)
    assertEquals(0x203FFFFF, flags);
  }
  private void testCFRuleRecord(CFRuleRecord record) {
    FontFormatting fontFormatting = new FontFormatting();
    testFontFormattingAccessors(fontFormatting);
    assertFalse(record.containsFontFormattingBlock());
    record.setFontFormatting(fontFormatting);
    assertTrue(record.containsFontFormattingBlock());

    BorderFormatting borderFormatting = new BorderFormatting();
    testBorderFormattingAccessors(borderFormatting);
    assertFalse(record.containsBorderFormattingBlock());
    record.setBorderFormatting(borderFormatting);
    assertTrue(record.containsBorderFormattingBlock());

    assertFalse(record.isLeftBorderModified());
    record.setLeftBorderModified(true);
    assertTrue(record.isLeftBorderModified());

    assertFalse(record.isRightBorderModified());
    record.setRightBorderModified(true);
    assertTrue(record.isRightBorderModified());

    assertFalse(record.isTopBorderModified());
    record.setTopBorderModified(true);
    assertTrue(record.isTopBorderModified());

    assertFalse(record.isBottomBorderModified());
    record.setBottomBorderModified(true);
    assertTrue(record.isBottomBorderModified());

    assertFalse(record.isTopLeftBottomRightBorderModified());
    record.setTopLeftBottomRightBorderModified(true);
    assertTrue(record.isTopLeftBottomRightBorderModified());

    assertFalse(record.isBottomLeftTopRightBorderModified());
    record.setBottomLeftTopRightBorderModified(true);
    assertTrue(record.isBottomLeftTopRightBorderModified());

    PatternFormatting patternFormatting = new PatternFormatting();
    testPatternFormattingAccessors(patternFormatting);
    assertFalse(record.containsPatternFormattingBlock());
    record.setPatternFormatting(patternFormatting);
    assertTrue(record.containsPatternFormattingBlock());

    assertFalse(record.isPatternBackgroundColorModified());
    record.setPatternBackgroundColorModified(true);
    assertTrue(record.isPatternBackgroundColorModified());

    assertFalse(record.isPatternColorModified());
    record.setPatternColorModified(true);
    assertTrue(record.isPatternColorModified());

    assertFalse(record.isPatternStyleModified());
    record.setPatternStyleModified(true);
    assertTrue(record.isPatternStyleModified());
  }
  public void testConstructors() {
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet();

    CFRuleRecord rule1 = CFRuleRecord.create(sheet, "7");
    assertEquals(CFRuleRecord.CONDITION_TYPE_FORMULA, rule1.getConditionType());
    assertEquals(ComparisonOperator.NO_COMPARISON, rule1.getComparisonOperation());
    assertNotNull(rule1.getParsedExpression1());
    assertSame(Ptg.EMPTY_PTG_ARRAY, rule1.getParsedExpression2());

    CFRuleRecord rule2 = CFRuleRecord.create(sheet, ComparisonOperator.BETWEEN, "2", "5");
    assertEquals(CFRuleRecord.CONDITION_TYPE_CELL_VALUE_IS, rule2.getConditionType());
    assertEquals(ComparisonOperator.BETWEEN, rule2.getComparisonOperation());
    assertNotNull(rule2.getParsedExpression1());
    assertNotNull(rule2.getParsedExpression2());

    CFRuleRecord rule3 = CFRuleRecord.create(sheet, ComparisonOperator.EQUAL, null, null);
    assertEquals(CFRuleRecord.CONDITION_TYPE_CELL_VALUE_IS, rule3.getConditionType());
    assertEquals(ComparisonOperator.EQUAL, rule3.getComparisonOperation());
    assertSame(Ptg.EMPTY_PTG_ARRAY, rule3.getParsedExpression2());
    assertSame(Ptg.EMPTY_PTG_ARRAY, rule3.getParsedExpression2());
  }