瀏覽代碼

Fix the line interval deletion bug

Signed-off-by: Vadim Markovtsev <vadim@sourced.tech>
Vadim Markovtsev 6 年之前
父節點
當前提交
9c59a0e892
共有 2 個文件被更改,包括 33 次插入1 次删除
  1. 15 1
      internal/burndown/file.go
  2. 18 0
      internal/burndown/file_test.go

+ 15 - 1
internal/burndown/file.go

@@ -149,6 +149,13 @@ func (file *File) Update(time int, pos int, insLength int, delLength int) {
 	}
 	iter := tree.FindLE(pos)
 	origin := *iter.Item()
+	prevOrigin := origin
+	{
+		prevIter := iter.Prev()
+		if prevIter.Item() != nil {
+			prevOrigin = *prevIter.Item()
+		}
+	}
 	if insLength > 0 {
 		file.updateTime(time, time, insLength)
 	}
@@ -180,6 +187,11 @@ func (file *File) Update(time int, pos int, insLength int, delLength int) {
 			break
 		}
 		delta := internal.Min(nextIter.Item().Key, pos+delLength) - internal.Max(node.Key, pos)
+		if delta == 0 && insLength == 0 && origin.Key == pos && prevOrigin.Value == node.Value {
+			origin = *node
+			tree.DeleteWithIterator(iter)
+			iter = nextIter
+		}
 		if delta <= 0 {
 			break
 		}
@@ -233,7 +245,9 @@ func (file *File) Update(time int, pos int, insLength int, delLength int) {
 			// recover the beginning
 			tree.Insert(rbtree.Item{Key: pos, Value: time})
 		}
-	} else if (pos > origin.Key && previous.Value != origin.Value) || pos == origin.Key || pos == 0 {
+	} else if (pos > origin.Key && previous.Value != origin.Value) ||
+		(pos == origin.Key && origin.Value != prevOrigin.Value) ||
+		pos == 0 {
 		// continue the original interval
 		tree.Insert(rbtree.Item{Key: pos, Value: origin.Value})
 	}

+ 18 - 0
internal/burndown/file_test.go

@@ -211,6 +211,24 @@ func TestFusedFile(t *testing.T) {
 	assert.Equal(t, "0 0\n10 1\n16 0\n99 -1\n", dump)
 	assert.Equal(t, int64(93), status[0])
 	assert.Equal(t, int64(6), status[1])
+	file.Update(3, 10, 0, 6)
+	dump = file.Dump()
+	assert.Equal(t, "0 0\n93 -1\n", dump)
+}
+
+func TestDeleteSameBeginning(t *testing.T) {
+	file, _ := fixtureFile()
+	file.Update(1, 0, 5, 0)
+	dump := file.Dump()
+	// Output:
+	// 0 0
+	// 10 1
+	// 16 0
+	// 99 -1
+	assert.Equal(t, "0 1\n5 0\n105 -1\n", dump)
+	file.Update(3, 0, 0, 5)
+	dump = file.Dump()
+	assert.Equal(t, "0 0\n100 -1\n", dump)
 }
 
 func TestInsertSameTimeFile(t *testing.T) {