# This "good first bug" is taken by @YongPilMoon. Don't work on it unless that's you!

This has been discussed a few times before but I don’t think there was any conclusion, and PRs intending to solve the issue were not merged for various reasons.

I would like to close those PRs as outdated, and reboot the discussion about this.
Performance considered, the conclusion from @sebmarkbage and @syranide seems to be:

> We should consider not allowing conflicting style rules at all.

— https://github.com/facebook/react/pull/2013#issuecomment-57338177

> IMHO, all things considered it's better to just disallow overlapping and warn in dev.

— https://github.com/facebook/react/pull/4661#issuecomment-132996649

Radium by @ianobermiller came to the same conclusion in https://github.com/FormidableLabs/radium/issues/95 but there was some backlash afterwards. React Native seems to allow style expansions but only for a few attributes (e.g. `margin` and `padding`, but not `border`).

I’m closing old pull requests about this, and creating this issue to track implementation of the behavior we seem to agree upon: we should warn in `__DEV__` when `border` and `borderBottom` are used at the same time. We can discuss more specifics (should either be ignored? should we allow a few whitelisted properties but warn for others?) in this issue.

As a migration strategy, we can suggest people to use something like https://github.com/ActionIQ/style-builder if they really need those shortcuts. It’s also something we’ll need to decide upon when implementing integrated styling.

---

Related issues:
- #2231
- #2407
- #5030
- https://github.com/FormidableLabs/radium/issues/95

Related PRs:
- #2013
- #4661

});
    it('allows objects that inherit a custom toString method', function() {
      const parent = {toString: () => 'hello.jpg'};
      const child = Object.create(parent);
      const el = ReactTestUtils.renderIntoDocument(<img src={child} />);
      expect(el.src).toBe('hello.jpg');
    });
    it('assigns ajaxify (an important internal FB attribute)', function() {
      const options = {toString: () => 'ajaxy'};
      const el = ReactTestUtils.renderIntoDocument(<div ajaxify={options} />);
      expect(el.getAttribute('ajaxify')).toBe('ajaxy');
    });
  });
  describe('String boolean attributes', function() {
    it('does not assign string boolean attributes for custom attributes', function() {
      let el;
      expect(() => {
        el = ReactTestUtils.renderIntoDocument(<div whatever={true} />);
      }).toWarnDev(
        'Received `true` for a non-boolean attribute `whatever`.\n\n' +
          'If you want to write it to the DOM, pass a string instead: ' +
          'whatever="true" or whatever={value.toString()}.',
      );
      expect(el.hasAttribute('whatever')).toBe(false);
    });
    it('stringifies the boolean true for allowed attributes', function() {
      const el = ReactTestUtils.renderIntoDocument(<div spellCheck={true} />);
      expect(el.getAttribute('spellCheck')).toBe('true');
    });
    it('stringifies the boolean false for allowed attributes', function() {