# encoding: utf-8

require 'test/helper'

class Nanoc3::DependencyTrackerTest < MiniTest::Unit::TestCase

include Nanoc3::TestHelpers

def test_initialize
# Mock items
items = [ mock, mock ]

# Create
tracker = Nanoc3::DependencyTracker.new(items)

# Verify no dependencies yet
assert_equal [], tracker.dependencies_for(items[0])
assert_equal [], tracker.dependencies_for(items[1])
end

def test_record_dependency
# Mock items
items = [ mock, mock ]

# Create
tracker = Nanoc3::DependencyTracker.new(items)

# Record some dependencies
tracker.record_dependency(items[0], items[1])

# Verify dependencies
assert_equal [ items[1] ], tracker.dependencies_for(items[0])
end

def test_start_and_stop
# Mock items
items = [ mock, mock ]

# Create
tracker = Nanoc3::DependencyTracker.new(items)

# Start, do something and stop
tracker.start
Nanoc3::NotificationCenter.post(:visit_started, items[0])
Nanoc3::NotificationCenter.post(:visit_started, items[1])
Nanoc3::NotificationCenter.post(:visit_ended, items[1])
Nanoc3::NotificationCenter.post(:visit_ended, items[0])
tracker.stop

# Verify dependencies
assert_equal [ items[1] ], tracker.dependencies_for(items[0])
assert_equal [], tracker.dependencies_for(items[1])
end

def test_store_graph_and_load_graph_simple
# Mock items
items = [ mock, mock, mock, mock ]
items[0].stubs(:path).returns('/aaa/')
items[1].stubs(:path).returns('/bbb/')
items[2].stubs(:path).returns('/ccc/')
items[3].stubs(:path).returns('/ddd/')

# Create
tracker = Nanoc3::DependencyTracker.new(items)

# Record some dependencies
tracker.record_dependency(items[0], items[1])
tracker.record_dependency(items[1], items[2])
tracker.record_dependency(items[1], items[3])

# Store
tracker.store_graph
assert File.file?(tracker.filename)

# Re-create
tracker = Nanoc3::DependencyTracker.new(items)

# Load
tracker.load_graph

# Check loaded graph
assert_equal [ items[1] ], tracker.dependencies_for(items[0])
assert_equal [ items[2], items[3] ], tracker.dependencies_for(items[1])
assert_equal [], tracker.dependencies_for(items[2])
assert_equal [], tracker.dependencies_for(items[3])
end

def test_store_graph_with_custom_filename
# Mock items
items = [ mock, mock, mock, mock ]
items[0].stubs(:path).returns('/aaa/')
items[1].stubs(:path).returns('/bbb/')
items[2].stubs(:path).returns('/ccc/')
items[3].stubs(:path).returns('/ddd/')

# Create
tracker = Nanoc3::DependencyTracker.new(items)
tracker.filename = 'tmp/bob/iguana/bits'

# Record some dependencies
tracker.record_dependency(items[0], items[1])
tracker.record_dependency(items[1], items[2])
tracker.record_dependency(items[1], items[3])

# Store
tracker.store_graph
assert File.file?(tracker.filename)
assert File.file?('tmp/bob/iguana/bits')
end

def test_store_graph_and_load_graph_with_removed_items
end

def test_store_graph_and_load_graph_with_added_items
end

def test_store_graph_and_load_graph_with_added_and_removed_items
end

def test_item_with_path
# Mock items
items = [ mock, mock, mock, mock ]
items[0].stubs(:path).returns('/aaa/')
items[1].stubs(:path).returns('/bbb/')
items[2].stubs(:path).returns('/ccc/')
items[3].stubs(:path).returns('/ddd/')

# Create
tracker = Nanoc3::DependencyTracker.new(items)

# Test
assert_equal items[0], tracker.send(:item_with_path, '/aaa/')
assert_equal items[1], tracker.send(:item_with_path, '/bbb/')
assert_equal items[2], tracker.send(:item_with_path, '/ccc/')
assert_equal items[3], tracker.send(:item_with_path, '/ddd/')
assert_equal nil, tracker.send(:item_with_path, '/123/')
end

end