From 86119588385a51a685daaace6f236021e3bff007 Mon Sep 17 00:00:00 2001
From: Will Murphy <willmurphyscode@gmail.com>
Date: Sun, 8 Jul 2018 13:36:59 -0400
Subject: [PATCH] Calculate efficiency score

For now, efficiency score is simply the number of unique files over the
total number of files that appear in any layer.
---
 filetree/tree.go      | 10 ++++++++++
 filetree/tree_test.go | 29 +++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/filetree/tree.go b/filetree/tree.go
index 373f457..3b05571 100644
--- a/filetree/tree.go
+++ b/filetree/tree.go
@@ -241,3 +241,13 @@ func EfficiencyMap(trees []*FileTree) map[string]int {
 	}
 	return result
 }
+
+func EfficiencyScore(trees []*FileTree) float64 {
+	efficiencyMap := EfficiencyMap(trees)
+	uniquePaths := len(efficiencyMap)
+	pathAppearances := 0
+	for _, value := range efficiencyMap {
+		pathAppearances += value
+	}
+	return float64(uniquePaths) / float64(pathAppearances)
+}
diff --git a/filetree/tree_test.go b/filetree/tree_test.go
index 30340a1..c389492 100644
--- a/filetree/tree_test.go
+++ b/filetree/tree_test.go
@@ -2,6 +2,7 @@ package filetree
 
 import (
 	"fmt"
+	"math"
 	"reflect"
 	"testing"
 )
@@ -478,3 +479,31 @@ func TestEfficencyMap(t *testing.T) {
 		t.Fatalf("Expected %v but go %v", expectedMap, actualMap)
 	}
 }
+
+func TestEfficiencyScore(t *testing.T) {
+	trees := make([]*FileTree, 3)
+	for ix, _ := range trees {
+		tree := NewFileTree()
+		tree.AddPath("/etc/nginx/nginx.conf", FileInfo{})
+		tree.AddPath("/etc/nginx/public", FileInfo{})
+		trees[ix] = tree
+	}
+	expected := 2.0 / 6.0
+	actual := EfficiencyScore(trees)
+	if math.Abs(expected-actual) > 0.0001 {
+		t.Fatalf("Expected %f but got %f", expected, actual)
+	}
+
+	trees = make([]*FileInfo, 1)
+	for ix, _ := range trees {
+		tree := NewFileTree()
+		tree.AddPath("/etc/nginx/nginx.conf", FileInfo{})
+		tree.AddPath("/etc/nginx/public", FileInfo{})
+		trees[ix] = tree
+	}
+	expected = 1.0
+	actual = EfficiencyScore(trees)
+	if math.Abs(expected-actual) > 0.0001 {
+		t.Fatalf("Expected %f but got %f", expected, actual)
+	}
+}