Module olivia.tests.test_packagemetrics

Expand source code
import networkx as nx
import numpy as np

from olivia.model import OliviaNetwork
from olivia.packagemetrics import Reach, Surface, Impact, MetricStats, DependenciesCount, DependentsCount

G = nx.DiGraph()
G.add_edges_from((['a', 'b'],
                  ['b', 'c'],
                  ['c', 'd'],
                  ['d', 'e'],
                  ['e', 'b'],
                  ['d', 'f'],
                  ['f', 'g'],
                  ['g', 'j'],
                  ['f', 'i'],
                  ['f', 'h'],
                  ['i', 'h'],
                  ['h', 'i'],
                  ['i', 'j'],
                  ['h', 'k'],
                  ['j', 'k'],
                  ['k', 'j'],
                  ['a', 'l']))

net = OliviaNetwork()
net.build_model(G)


def test_reach():
    m = Reach(net).compute()
    assert m.results_dict == {'a': 12,
                              'b': 10,
                              'c': 10,
                              'd': 10,
                              'e': 10,
                              'f': 6,
                              'g': 3,
                              'h': 4,
                              'i': 4,
                              'j': 2,
                              'k': 2,
                              'l': 1}, 'Result does not match'


def test_surface():
    m = Surface(net).compute()
    assert m.results_dict == {'a': 1,
                              'b': 5,
                              'c': 5,
                              'd': 5,
                              'e': 5,
                              'f': 6,
                              'g': 7,
                              'h': 8,
                              'i': 8,
                              'j': 11,
                              'k': 11,
                              'l': 2}, 'Result does not match'


def test_impact():
    m = Impact(net).compute()
    assert m.results_dict == {'a': 17,
                              'b': 15,
                              'c': 15,
                              'd': 15,
                              'e': 15,
                              'f': 10,
                              'g': 3,
                              'h': 6,
                              'i': 6,
                              'j': 2,
                              'k': 2,
                              'l': 0}, 'Result does not match'


def test_dependenciescount():
    m = DependenciesCount(net).compute()
    assert m.results_dict == {'a': 0,
                              'b': 2,
                              'c': 1,
                              'd': 1,
                              'e': 1,
                              'f': 1,
                              'g': 1,
                              'j': 3,
                              'i': 2,
                              'h': 2,
                              'k': 2,
                              'l': 1}, 'Result does not match'


def test_dependentscount():
    m = DependentsCount(net).compute()
    assert m.results_dict == {'a': 2,
                              'b': 1,
                              'c': 1,
                              'd': 2,
                              'e': 1,
                              'f': 3,
                              'g': 1,
                              'j': 1,
                              'i': 2,
                              'h': 2,
                              'k': 1,
                              'l': 0}, 'Result does not match'


def test_metric_stats():
    ms = MetricStats({'a': 2, 'b': 4, 'c': 6}, normalize_factor=2)

    assert ms.top() == [('c', 6)]
    assert ms.top(2) == [('c', 6), ('b', 4)]
    assert ms.top(2, subset={'a', 'b'}) == [('b', 4), ('a', 2)]
    assert ms.bottom() == [('a', 2)]
    assert ms.bottom(2) == [('b', 4), ('a', 2)]
    assert ms.bottom(2, subset={'a', 'c'}) == [('a', 2), ('c', 6)]
    ms.normalize()
    assert np.array_equal(ms.values, np.array([1, 2, 3]))
    ms.normalize()
    assert np.array_equal(ms.values, np.array([1, 2, 3]))

def test_metric_ops():
    ms1 = MetricStats({'a': 2, 'b': 4, 'c': 6})
    ms2 = MetricStats({'a': 1, 'b': 2, 'c': 3})

    assert (ms1 * 2 - ms2 - 1).results_dict == {'a': 2, 'b': 5, 'c': 8}
    assert (ms1 ** 2 / ms2).results_dict == {'a': 4, 'b': 8, 'c': 12}
    assert ((ms1 + ms2) ** 2).results_dict == {'a': 9, 'b': 36, 'c': 81}
    assert (ms1 ** ms2 + 1).results_dict == {'a': 3, 'b': 17, 'c': 217}
    assert (ms2 / 2).results_dict == {'a': 0.5, 'b': 1, 'c': 1.5}

Functions

def test_dependenciescount()
Expand source code
def test_dependenciescount():
    m = DependenciesCount(net).compute()
    assert m.results_dict == {'a': 0,
                              'b': 2,
                              'c': 1,
                              'd': 1,
                              'e': 1,
                              'f': 1,
                              'g': 1,
                              'j': 3,
                              'i': 2,
                              'h': 2,
                              'k': 2,
                              'l': 1}, 'Result does not match'
def test_dependentscount()
Expand source code
def test_dependentscount():
    m = DependentsCount(net).compute()
    assert m.results_dict == {'a': 2,
                              'b': 1,
                              'c': 1,
                              'd': 2,
                              'e': 1,
                              'f': 3,
                              'g': 1,
                              'j': 1,
                              'i': 2,
                              'h': 2,
                              'k': 1,
                              'l': 0}, 'Result does not match'
def test_impact()
Expand source code
def test_impact():
    m = Impact(net).compute()
    assert m.results_dict == {'a': 17,
                              'b': 15,
                              'c': 15,
                              'd': 15,
                              'e': 15,
                              'f': 10,
                              'g': 3,
                              'h': 6,
                              'i': 6,
                              'j': 2,
                              'k': 2,
                              'l': 0}, 'Result does not match'
def test_metric_ops()
Expand source code
def test_metric_ops():
    ms1 = MetricStats({'a': 2, 'b': 4, 'c': 6})
    ms2 = MetricStats({'a': 1, 'b': 2, 'c': 3})

    assert (ms1 * 2 - ms2 - 1).results_dict == {'a': 2, 'b': 5, 'c': 8}
    assert (ms1 ** 2 / ms2).results_dict == {'a': 4, 'b': 8, 'c': 12}
    assert ((ms1 + ms2) ** 2).results_dict == {'a': 9, 'b': 36, 'c': 81}
    assert (ms1 ** ms2 + 1).results_dict == {'a': 3, 'b': 17, 'c': 217}
    assert (ms2 / 2).results_dict == {'a': 0.5, 'b': 1, 'c': 1.5}
def test_metric_stats()
Expand source code
def test_metric_stats():
    ms = MetricStats({'a': 2, 'b': 4, 'c': 6}, normalize_factor=2)

    assert ms.top() == [('c', 6)]
    assert ms.top(2) == [('c', 6), ('b', 4)]
    assert ms.top(2, subset={'a', 'b'}) == [('b', 4), ('a', 2)]
    assert ms.bottom() == [('a', 2)]
    assert ms.bottom(2) == [('b', 4), ('a', 2)]
    assert ms.bottom(2, subset={'a', 'c'}) == [('a', 2), ('c', 6)]
    ms.normalize()
    assert np.array_equal(ms.values, np.array([1, 2, 3]))
    ms.normalize()
    assert np.array_equal(ms.values, np.array([1, 2, 3]))
def test_reach()
Expand source code
def test_reach():
    m = Reach(net).compute()
    assert m.results_dict == {'a': 12,
                              'b': 10,
                              'c': 10,
                              'd': 10,
                              'e': 10,
                              'f': 6,
                              'g': 3,
                              'h': 4,
                              'i': 4,
                              'j': 2,
                              'k': 2,
                              'l': 1}, 'Result does not match'
def test_surface()
Expand source code
def test_surface():
    m = Surface(net).compute()
    assert m.results_dict == {'a': 1,
                              'b': 5,
                              'c': 5,
                              'd': 5,
                              'e': 5,
                              'f': 6,
                              'g': 7,
                              'h': 8,
                              'i': 8,
                              'j': 11,
                              'k': 11,
                              'l': 2}, 'Result does not match'