Skip to content

Commit

Permalink
Prevent nesting properties
Browse files Browse the repository at this point in the history
Prevent nesting properties or otherwise adding properties
during execution.
  • Loading branch information
NthPortal committed Aug 21, 2020
1 parent 123cba0 commit eb0c945
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/main/scala/org/scalacheck/Properties.scala
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import util.ConsoleReporter
class Properties(val name: String) {

private val props = new scala.collection.mutable.ListBuffer[(String,Prop)]
private var frozen = false

/**
* Customize the parameters specific to this class.
Expand All @@ -46,7 +47,10 @@ class Properties(val name: String) {

/** Returns all properties of this collection in a list of name/property
* pairs. */
def properties: collection.Seq[(String,Prop)] = props
def properties: collection.Seq[(String,Prop)] = {
frozen = true // once the properties have been exposed, they must be frozen
props
}

/** Convenience method that checks the properties with the given parameters
* (or default parameters, if not specified)
Expand Down Expand Up @@ -100,6 +104,7 @@ class Properties(val name: String) {
*/
sealed class PropertySpecifier() {
def update(propName: String, p: => Prop) = {
if (frozen) throw new IllegalStateException("cannot nest properties or create properties during execution")
val fullName = s"$name.$propName"
props += ((fullName, Prop.delay(p).viewSeed(fullName)))
}
Expand Down
37 changes: 37 additions & 0 deletions src/test/scala/org/scalacheck/NoPropertyNestingSpecification.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*-------------------------------------------------------------------------*\
** ScalaCheck **
** Copyright (c) 2007-2019 Rickard Nilsson. All rights reserved. **
** http://www.scalacheck.org **
** **
** This software is released under the terms of the Revised BSD License. **
** There is NO WARRANTY. See the file LICENSE for the full text. **
\*------------------------------------------------------------------------ */

package org.scalacheck

object NoPropertyNestingSpecification extends Properties("Properties.no nesting") {
property("no nested properties") = {
var thrown = false

val p = new Properties("P") {
property("outer") = {
property("inner") = true // not allowed!
true
}
}

p.freeze() // don't have a good way of testing how sbt does this
val results = for ((name, prop) <- p.properties) yield prop(Gen.Parameters.default)
results match {
case collection.Seq(res) => res.status match {
case Prop.Exception(e: IllegalStateException) =>
if (e.getMessage contains "nest") thrown = true
else throw new Exception("exception message did not reference nesting")
case _ => throw new Exception("did not get IllegalStateException")
}
case _ => throw new Exception("more than one property, somehow")
}

thrown == true
}
}

0 comments on commit eb0c945

Please sign in to comment.