@quartic/bokehjs
Version:
Interactive, novel data visualization
151 lines (125 loc) • 5.96 kB
text/coffeescript
{expect} = require "chai"
sinon = require 'sinon'
utils = require "../../utils"
{ColumnDataSource} = utils.require("models/sources/column_data_source")
{GlyphRenderer} = utils.require("models/renderers/glyph_renderer")
{LegendItem} = utils.require("models/annotations/legend_item")
{logger} = utils.require("core/logging")
describe "LegendItem", ->
describe "initialize", ->
afterEach ->
@sandbox.restore()
beforeEach ->
@sandbox = sinon.sandbox.create()
@sandbox.stub(logger, "error")
it "should log an error if _check_data_sources_on_renderers is false", ->
sinon.stub(LegendItem.prototype, '_check_data_sources_on_renderers').returns(false)
legend_item = new LegendItem()
sinon.assert.calledOnce(logger.error)
LegendItem.prototype._check_data_sources_on_renderers.restore()
it "should log an error if _check_field_label_on_data_source is false", ->
sinon.stub(LegendItem.prototype, '_check_field_label_on_data_source').returns(false)
legend_item = new LegendItem()
sinon.assert.calledOnce(logger.error)
LegendItem.prototype._check_field_label_on_data_source.restore()
describe "_check_data_sources_on_renderers", ->
it "should return false if field label and different data sources", ->
gr_1 = new GlyphRenderer({ data_source: new ColumnDataSource() })
gr_2 = new GlyphRenderer({ data_source: new ColumnDataSource() })
legend_item = new LegendItem({
label: { field: 'label' },
renderers: [ gr_1, gr_2 ]
})
expect(legend_item._check_data_sources_on_renderers()).to.be.false
it "should return false if field label and no renderers", ->
legend_item = new LegendItem({
label: { field: 'label' },
renderers: [ ]
})
expect(legend_item._check_data_sources_on_renderers()).to.be.false
it "should return true if value label and different data sources", ->
gr_1 = new GlyphRenderer({ data_source: new ColumnDataSource() })
gr_2 = new GlyphRenderer({ data_source: new ColumnDataSource() })
legend_item = new LegendItem({
label: { value: 'label' },
renderers: [ gr_1, gr_2 ]
})
expect(legend_item._check_data_sources_on_renderers()).to.be.true
describe "_check_field_label_on_data_source", ->
it "should return false if field label and label not in data source", ->
gr_1 = new GlyphRenderer({
data_source: new ColumnDataSource({data: {foo: [1]}})
})
legend_item = new LegendItem({
label: { field: 'label' },
renderers: [ gr_1 ]
})
expect(legend_item._check_field_label_on_data_source()).to.be.false
it "should return false if field label and no renderers", ->
legend_item = new LegendItem({
label: { field: 'label' },
renderers: [ ]
})
expect(legend_item._check_field_label_on_data_source()).to.be.false
it "should return true if field label and label in data source", ->
gr_1 = new GlyphRenderer({
data_source: new ColumnDataSource({data: {label: [1]}})
})
legend_item = new LegendItem({
label: { field: 'label' },
renderers: [ gr_1 ]
})
expect(legend_item._check_field_label_on_data_source()).to.be.true
describe "get_field_from_label_prop", ->
it "should return undefined if label property is null", ->
legend_item = new LegendItem({label: null})
field = legend_item.get_field_from_label_prop()
expect(field).to.be.undefined
it "should return undefined if label property is value", ->
legend_item = new LegendItem({label: {value: 'milk'}})
field = legend_item.get_field_from_label_prop()
expect(field).to.be.undefined
it "should return field if label property is field", ->
legend_item = new LegendItem({label: {field: 'milk'}})
field = legend_item.get_field_from_label_prop()
expect(field).to.be.equal 'milk'
describe "get_labels_list_from_label_prop", ->
it "should return labels if field is valid", ->
source = new ColumnDataSource({
data: {
label: ['foo', 'bar', 'foo', 'bar']
},
selection_manager: null,
})
gr = new GlyphRenderer({'data_source': source})
legend_item = new LegendItem({label: {field: 'label'}, 'renderers': [gr]})
field = legend_item.get_labels_list_from_label_prop()
expect(field).to.be.deep.equal ['foo', 'bar']
it "should return 'Invalid field' list if field is not in datasource", ->
source = new ColumnDataSource({
data: {
x: [10, 20, 30, 40],
},
selection_manager: null,
})
gr = new GlyphRenderer({'data_source': source})
legend_item = new LegendItem({label: {field: 'milk'}, 'renderers': [gr]})
field = legend_item.get_labels_list_from_label_prop()
expect(field).to.be.deep.equal ['Invalid field']
it "should return 'No source found' list if no renderer and field used", ->
legend_item = new LegendItem({label: {field: 'milk'}, 'renderers': []})
field = legend_item.get_labels_list_from_label_prop()
expect(field).to.be.deep.equal ['No source found']
it "should return 'No source found' list if no source on renderer", ->
gr = new GlyphRenderer()
legend_item = new LegendItem({label: {field: 'milk'}, 'renderers': [gr]})
field = legend_item.get_labels_list_from_label_prop()
expect(field).to.be.deep.equal ['No source found']
it "should return value in single list if label is value", ->
legend_item = new LegendItem({label: {value: 'milk'}})
field = legend_item.get_labels_list_from_label_prop()
expect(field).to.be.deep.equal ['milk']
it "should return empty list if label is null", ->
legend_item = new LegendItem({label: null})
field = legend_item.get_labels_list_from_label_prop()
expect(field).to.be.deep.equal []